题目描述:

在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
  *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)(不包含. , 等特殊字符
  ?:匹配1个字符

输入
  通配符表达式;
  一组字符串。

输出
  返回匹配的结果,正确输出true,错误输出false

思路:

分三种情况:

(1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false

(2)通配符为?的情况:对应的一个字符是字母(不区分大小写)或数字,否则匹配失败,输出false

(3)通配符为*的情况:匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,否则匹配失败,输出false

如果最后经过循环后没有false输出,则表明匹配成功,输出true

 import java.util.Scanner;

 /**
* 在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。
* 现要求各位实现字符串通配符的算法。
* 要求:
* 实现如下2个通配符:
*   *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)
*   ?:匹配1个字符
*
* 输入
* 通配符表达式;
* 一组字符串。
* 输出
* 返回匹配的结果,正确输出true,错误输出false
*
*/
public class StringMatch { public static void main(String[] args) {
//输入,读入两行字符
Scanner cin = new Scanner(System.in) ;
String str = cin.nextLine() ;
String strMatch = cin.nextLine() ;
cin.close(); int len = str.length() ;
int lenMatch = strMatch.length() ;
int i = 0 ;
int j = 0 ; char temp ;
//循环比较,判断条件是当任一个到达字符串尾时结束循环
while(i < len && j < lenMatch ){
/*
* 分三种情况:
* (1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false
* (2)通配符为?的情况:对应的一个字符是字母(不区分大小写)或数字,
* 否则匹配失败,输出false
* (3)通配符为*的情况:匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,
* 否则匹配失败,输出false
* 如果最后经过循环后没有false输出,则表明匹配成功,输出true
*/
if(str.charAt(i) != '*' && str.charAt(i) != '?' ){
//(1)无通配符的情况
if(str.charAt(i) != strMatch.charAt(j)){
//匹配失败,输出false
System.out.println("false");
return ;
}else{
//匹配成功,进入各自下一个字符的匹配
i++ ;
j++ ;
continue ;
}
}else if(str.charAt(i) == '?'){
//(2)通配符为?的情况
temp = strMatch.charAt(j) ;
if( (temp >= 'a' && temp <= 'z')
|| (temp >= 'A' && temp <= 'Z')
|| (temp >= '0' && temp <= '9')){
//匹配成功,进入各自下一个字符的匹配
i++ ;
j++ ;
continue ;
}else{
//匹配失败,输出false
System.out.println("false");
return ;
}
}else{
//(3)通配符为*的情况
temp = strMatch.charAt(j) ;
if( (temp >= 'a' && temp <= 'z')
|| (temp >= 'A' && temp <= 'Z')
|| (temp >= '0' && temp <= '9')){
//strMatch的当前字符匹配成功,进入strMatch的下一个字符的匹配
j++ ;
continue ;
}else{
//匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,
//表明StrMatch的当前字符为非数字、字母的字符,必须匹配str中*后一个字符
if(i == (len-1)){
//如果str中*是最后一个,则匹配失败,输出false
System.out.println("false");
return ;
}else{
//如果str中*不是最后一个,则继续str中的下一个,继续匹配
i++ ;
continue ;
}
}
}
} System.out.println("true");
return ;
} }

华为OJ平台——字符串通配符的更多相关文章

  1. 华为OJ平台——字符串分隔

    题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输 ...

  2. 华为OJ平台——输出最小的k个数

    输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...

  3. 华为OJ平台——矩阵乘法

    题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵 ...

  4. 华为OJ平台——统计字符串中的大写字母

    题目描述: 统计字符串中的大写字母的个数 输入: 一行字符串 输出: 字符串中大写字母的个数(当空串时输出0) 思路: 这一题很简单,直接判断字符串中的每一个字符即可,唯一要注意的一点是输入的字符串可 ...

  5. 华为OJ平台——计算字符串的相似度

    题目描述: 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把“a”替换为“b”. 2 增加一个字符,如 ...

  6. 华为OJ平台——密码强度等级

    题目描述: 密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分. 一.密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 二.字母: 0  ...

  7. 华为OJ平台——字符串匹配

    题目描述: 判断短字符串中的所有字符是否在长字符串中全部出现 输入: 输入两个字符串. 第一个为短字符,第二个为长字符 输出: true  - 表示短字符串中所有字符均在长字符串中出现 false - ...

  8. 华为OJ平台——整形数组合并

    题目描述: 将两个整型数组按照升序合并,并且过滤掉重复数组元素 输入: 输入说明,按下列顺序输入: 1 输入第一个数组的个数 2 输入第一个数组的数值 3 输入第二个数组的个数 4 输入第二个数组的数 ...

  9. 华为OJ平台——超长正整数相加

    题目描述: 请设计一个算法完成两个超长正整数的加法. 输入 输入两个字符串数字 输出 输出相加后的结果,string型 样例输入 99999999999999999999999999999999999 ...

随机推荐

  1. [git]Git与Repo入门

    转自:http://www.cnblogs.com/angeldevil/archive/2013/11/26/3238470.html 注:非常推荐的一篇关于git的博文 目录: 版本控制 一.原始 ...

  2. linux awk命令

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  3. 第二次正式java web开发项目的总结(回收站恢复)

    都说互联网行业加班很是厉害,记得前不久网上还晒出了几个大城市互联网行业的加班排名调查,但是我们公司,或者说我们项目组倒是非常的例外,进公司也差不多半年了,才仅仅上个月有一个周六加过一天班而已. 不过好 ...

  4. final specifier (since C++11)

    Specifies that a virtual function cannot be overridden in a derived class or that a class cannot be  ...

  5. CentOs of Tomcat commands

    1.启动tomcat 进入tomcat目录的bin目录下 执行 [root@iZ253lxv4i0Z bin]# ./startup.sh Using CATALINA_BASE: /usr/loca ...

  6. centos6配置远程桌面,使用xmanager访问

    现在linux的图形界面越来越丰富,使用图形界面操作也逐渐成为使用者的一种习惯.在我们安装文件的过程中,经常会应用得到. 比如远程安装oracle,或者有多台主机.避免在不同主机间切换显示器. 1.检 ...

  7. 配置jetty 远程调试

    该调试不支持hessian 接口调用 1.配置远程jetty 服务器的 bin/jetty.sh JAVA_OPTIONS+=("-Xdebug -Xrunjdwp:server=y,tra ...

  8. xss 和 csrf攻击详解

    在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式.在这个年代, 参数化查询 已经成了普遍用法,我们已经离 SQL 注入很远了.但是,历史同 ...

  9. volatile适用场景

    1.volatile最适用一个线程写,多个线程读的场合. 如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来代替.(摘自Netty权威指南) 疑问:如果只是赋值的原子操作,是否可 ...

  10. Python深入05 装饰器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...