华为机试--字符串通配符 ( 循环解法 )
题目描述
问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。 要求: 实现如下2个通配符: *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同) ?:匹配1个字符
输入: 通配符表达式; 一组字符串。
输出:
返回匹配的结果,正确输出true,错误输出false
本题含有多组样例输入!
代码思想
取出字符串 a, b 的每一位分别比较
1.如果判断出 a 中当前字符是通配符 ? 那么就跳过一个字符 2.如果判断出 a 中当前字符是通配符 * 那么就循环遍历字符串 b 直到找到一个和 a 相同的字符 再遍历下一个 3.如果当前字符相同也跳过 4.如果当前字符既不是 ? 也不是 * 那么直接返回false
代码示例
package Test_0508;
//字符串通配符
import java.util.*;
public class Main2{
public static void main(String[] args){
Scanner sc = new Scanner (System.in);
while(sc.hasNext()){
String str1 = sc.nextLine();
String str2 = sc.nextLine();
System.out.println(isTrue(str1, str2));
}
}
public static boolean isTrue(String str1, String str2){
//例如
//t?t*.*
//txtl2.xls
int i = 0;
int j = 0;
boolean flag = false;
while(i != str1.length() && j != str2.length()){
//依次判断两个字符串的每一位是否相同
if(str1.charAt(i) == str2.charAt(j)){
//相同就都 ++
i++;
j++;
}else{
//不同的话分为三种情况
if(str1.charAt(i) == ?){
//1.
//第一个字符串是通配符 ?
//此时对应第二个字符串匹配一个字符
//所以 i 和 j 都++即可
i++;
j++;
}else if(str1.charAt(i) == *){
//2.
//第一个字符串是通配符 *
//此时对应第二个字符串匹配多个字符
//此时 i 先++
//然后把标识符替换为 true
//依次遍历第二个字符串
//直到找到一个和第一个字符串相同的字符
//再换为 false
i++;
flag = true;
}else if(flag){
//进行遍历操作
//直到再第二个字符串中找到
//和第一个字符串相同的字符才退出循环
//并把标识符设为false
while(str1.charAt(i) != str2.charAt(j)){
j++;
}
flag = false;
}else{
//3.
//既不是 ? 也不是 *
//此时直接返回false即可
return false;
}
}
}
//如果遍历了一圈还没有触发false
//那么就可以返回true
return true;
}
}
