JAVA-记笔记 三种解法

字符串通配符

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

搬运了三个题解中的别的 小记一下

import java.util.*;
import java.io.*;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String in;
        while((in = br.readLine())!=null){
            String temp = br.readLine();
            //System.out.println(isMatch(temp,in));
            System.out.println(getOc(in,temp));
            //System.out.println(getOc(in,temp,0,0));
        }
    }
    public static boolean getOc(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 getOc(s1, s2, p1, p2+1) || getOc(s1, s2, p1+1, p2+1);
        //遇到'?'跟两个一样操作一样,直接指针都往后移一个继续比较
        }else if (s1.charAt(p1) == '?' || s1.charAt(p1) == s2.charAt(p2)){
            return getOc(s1, s2, p1+1, p2+1);
        }else {
            return false;
        }
    }//method end
    public static  boolean getOc(String in,String temp){
        //字符串通配符
            in = in.replaceAll("\\?", "[0-9A-Za-z]{1}");
            in = in.replaceAll("\\*", "[0-9A-Za-z]{0,}");
            //in = in.replaceAll("\\.", "\\\\.");
            return temp.matches(in);
    }
    public static  boolean isMatch(String s, String p) {
         //动态规划
        if(s.length() == 0 && p.length() == 0)return true;
        if(s.length()!= 0 && p.length() == 0) return false;
        boolean [][] dp = new boolean [s.length()+1][p.length()+1];
        dp[0][0] = true;
        for(int j = 2; j <= p.length(); j++){
            if(p.charAt(j-1) == '*' && dp[0][j-2]){
                dp[0][j] = true;
            }
        }
        for(int i = 1; i <= s.length(); i++){
            for(int j = 1; j <= p.length(); j++){
                char a = s.charAt(i-1), b = p.charAt(j-1);
                if(a == b || b == '?'){
                    dp[i][j] = dp[i-1][j-1];
                }
                else if(b == '*'){
                    if(j>=2){
                         dp[i][j] = dp[i-1][j] || dp[i][j-2];
                    }

                       }

                else dp[i][j] = false;
            }
        }
        return dp[s.length()][p.length()];
    }

}  
全部评论
递归没有考虑*匹配到0个的情况
3 回复 分享
发布于 2022-07-17 10:24
正则的解法,时间会超
1 回复 分享
发布于 2022-03-31 15:34
in.replaceAll("\\*", "[0-9A-Za-z]{0,}"); 这样会超时,把\\* 改成 \\*+ 就可以通过了,但是效率还是低
1 回复 分享
发布于 2022-07-14 00:22
为啥我是用这方法temp.matches(in),就超时了 运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大
点赞 回复 分享
发布于 2021-10-04 21:44
第一种递归解法连?*匹配的字符是数字或字母都没有判断,直接就匹配任意字符了(实测用递归只能通过33组案例,最后一组案例含有太多*,递归会超时);第二种正则解法忽略了正则表达式中可能含有.+-[]等等这些有意义的字符
点赞 回复 分享
发布于 2023-03-25 15:26 湖南

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
评论
10
4
分享
牛客网
牛客企业服务