华为OJ平台——字符串通配符

时间:2021-07-11 12:59:51

题目描述:

在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下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 ;
} }