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

相关推荐

头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器-&gt;这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题-&gt;后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
评论
10
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务