华为机试--字符串通配符 ( 循环解法 )

题目描述

问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。 要求: 实现如下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;
    }
}
经验分享 程序员 微信小程序 职场和发展