字符串通配符(Java 递归)

字符串通配符

http://www.nowcoder.com/questionTerminal/43072d50a6eb44d2a6c816a283b02036

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            String s1 = in.nextLine();
            String s2 = in.nextLine();
            System.out.println(helper(s1, s2, 0, 0));
        }
    }

    private static boolean helper(String s1, String s2, int p1, int p2){
        //base case
        if (p1 == s1.length() && p2 == s2.length()){
            return true;
        }else if (p1 == s1.length() || p2 == s2.length()){
            return false;
        }
        //遇到'*'两种情况,要不就各跳过一个比较后面,要不就s2继续往后跳先不比较
        if (s1.charAt(p1) == '*'){
            return helper(s1, s2, p1, p2+1) || helper(s1, s2, p1+1, p2+1);
        //遇到'?'跟两个一样操作一样,直接指针都往后移一个继续比较
        }else if (s1.charAt(p1) == '?' || s1.charAt(p1) == s2.charAt(p2)){
            return helper(s1, s2, p1+1, p2+1);
        }else {
            return false;
        }
    }
}
全部评论
题中说的*是匹配0或以上的,我个人感觉得加上helper(s1,s2,p1+1,p2)在21行,否则a*和a返回的也是false
9 回复 分享
发布于 2020-12-24 13:38
改造了一些,正好通过 import java.util.Scanner; public class Main27 { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { String str = in.nextLine().toLowerCase(); String str1 = in.nextLine().toLowerCase(); System.out.println(isBoolean(str,str1,0,0)); } } static boolean isBoolean(String str,String str1 ,int n,int m){ if (str.length() == n && str1.length() == m){ return true; } if (str.length() == n || str1.length() == m){ return false; } if (str.charAt(n) == str1.charAt(m)){ return isBoolean(str,str1,n+1,m+1); } if (str.charAt(n) == '*' && n+1 !=str.length() && str.charAt(n+1) == '*'){ return isBoolean(str,str1,n+1,m); } if (str.charAt(n) == '?' && ((str1.charAt(m) >= '0' && str1.charAt(m) <= '9')|| (str1.charAt(m) >= 'a' && str1.charAt(m) <= 'z'))){ return isBoolean(str,str1,n+1,m+1); }else if (str.charAt(n) == '*' && ((str1.charAt(m) >= '0' && str1.charAt(m) <= '9')|| (str1.charAt(m) >= 'a' && str1.charAt(m) <= 'z'))){ return isBoolean(str,str1,n,m+1)||isBoolean(str,str1,n+1,m+1)||isBoolean(str,str1,n+1,m); }else { return false; } } }
2 回复 分享
发布于 2022-07-04 19:07
试都不用试,转大小写都没有,怎么可能通过
2 回复 分享
发布于 2022-12-01 19:02 英国
我也这样觉得。
点赞 回复 分享
发布于 2021-05-22 15:44
而他写的这个测试用例都过不了
点赞 回复 分享
发布于 2021-06-15 17:26
测试用例都没通过~
点赞 回复 分享
发布于 2021-08-07 18:14
写的有问题呀
点赞 回复 分享
发布于 2022-01-09 17:53
改进了一下你的代码,虽然结果正确,但超时了 import java.util.*; import java.util.regex.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ String s1 = in.nextLine().toLowerCase(); String s2 = in.nextLine().toLowerCase(); System.out.println(helper(s1, s2, 0, 0)); } } private static boolean helper(String s1, String s2, int p1, int p2){ String pattern="[^0-9^a-z^A-Z]"; //base case if (p1 == s1.length() && p2 == s2.length()){ return true; }else if (p1 == s1.length() || p2 == s2.length()){ return false; } //遇到'*'两种情况,要不就各跳过一个比较后面,要不就s2继续往后跳先不比较 //加入正则表达式,匹配到不合法就false,以及添加匹配0个字符 if (s1.charAt(p1) == '*'){ boolean ismatch=Pattern.matches(pattern,s2.charAt(p2)+""); if(ismatch) return false; return helper(s1, s2, p1, p2+1) || helper(s1, s2, p1+1, p2+1)||helper(s1, s2, p1+1, p2); //遇到'?'跟两个一样操作一样,直接指针都往后移一个继续比较 }else if (s1.charAt(p1) == '?'){ boolean ismatch=Pattern.matches(pattern,s2.charAt(p2)+""); if(ismatch) return false; return helper(s1, s2, p1+1, p2+1); }else if(s1.charAt(p1) == s2.charAt(p2)){ return helper(s1, s2, p1+1, p2+1); }else { return false; } } }
点赞 回复 分享
发布于 2022-03-21 20:02

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
19 收藏 评论
分享
牛客网
牛客企业服务