• leetcode——44.通配符匹配


    自己哼哧哼哧做了好久,两个多小时,终于完成了。。。

    public boolean isMatch(String s, String p) {
            //对p进行预处理
            int j = 0;
            while (j+1<p.length()){
                if(p.charAt(j) == '*' && p.charAt(j+1) == '*'){
                    p = p.substring(0,j+1).concat(p.substring(j+2));
                }else{
                    j++;
                }
            }
            return isMatched(s,p);
    
        }
    
        private boolean isMatched(String s, String p) {
            if(!p.contains("*") && !p.contains("?")){
                return p.equals(s);
            }
            if(s.length() == 0){
                if(p.length() == 1){
                    return p.equals("*");
                }else if(p.charAt(0) == '*'){
                    return isMatched(s,p.substring(1));
                }else{
                    return false;
                }
            }
            int i = 0,j = 0;
            while(i<s.length() && j<p.length()){
                if(s.charAt(i) == p.charAt(j) || p.charAt(j) == '?'){
                    i++;
                    j++;
                }else if(p.charAt(j) == '*'){
                    if(p.substring(j+1).contains("*")) {
                        if(j+1<p.length()) {
                            j++;
                        }else{
                            return true;
                        }
                        int k = j;
                        while (j < p.length() && p.charAt(j) != '*' && p.charAt(j) != '?') {
                            j++;
                        }
                        if(k == j){
                            return isMatched(s.substring(i),p.substring(j)) || isMatched(s.substring(i+1),p.substring(j));
                        }
                        if (s.substring(i).contains(p.substring(k, j))) {
                            int t = s.substring(i).indexOf(p.substring(k, j))+i;
                            return isMatched(s.substring(t + j - k), p.substring(j));
                        }else{
                            return false;
                        }
                    }else{
                        return isMatched(s.substring(i+1),p.substring(j)) || isMatched(s.substring(i+1),p.substring(j+1)) || isMatched(s.substring(i),p.substring(j+1));
                    }
               
                }else if(s.charAt(i) != p.charAt(j)){
                    return false;
                }
            }
            if(i == s.length()) {
                while (j < p.length()) {
                    if (p.charAt(j) == '*') {
                        j++;
                    } else {
                        return false;
                    }
                }
            }
            return i == s.length() && j == p.length();
        }

    看了别人的答案,尚且需要好好领悟

    public boolean isMatch(String s, String p) {
            int iStar = -1, jStar = -1, m = s.length(), n = p.length(), i = 0, j = 0;
            while (i < m) {
                if (j < n && (s.charAt(i) == p.charAt(j) || p.charAt(j) == '?')) {
                    i++;
                    j++;
                } else if (j < n && p.charAt(j) == '*') {
                    iStar = i;
                    jStar = j;
                    j++;
                } else if (iStar >= 0) {
                    i = ++iStar;
                    j = jStar + 1;
                } else {
                    return false;
                }
            }
            while (j < n && p.charAt(j) == '*') j++;
            return j == n;
        }

    ——2020.7.5


    才做完两天就不会了,要哭了。

    将之前别人的代码进行了注释:

    public boolean isMatch(String s, String p) {
            int iStar = -1, jStar = -1, m = s.length(), n = p.length(), i = 0, j = 0;
            while (i < m) {  //遍历s
                if (j < n && (s.charAt(i) == p.charAt(j) || p.charAt(j) == '?')) {  //当二者相等或者p[j]=’?‘时,继续向前推进
                    i++;
                    j++;
                } else if (j < n && p.charAt(j) == '*') {  //当p[j] == '*'时,记录两个字符串对应的位置,然后将j的位置向前推进,记录最新出现的'*'的位置
                    iStar = i;
                    jStar = j;
                    j++;
                } else if (iStar >= 0) {   //当i的坐标落后于j时,将i向前推进,j保持不变,处于'*'的下一个位置
                    i = ++iStar;
                    j = jStar + 1;
                } else {
                    return false;
                }
            }
            while (j < n && p.charAt(j) == '*') j++;  //将p字符串末尾的'*'全部遍历掉
            return j == n;
        }

    还要学会动态规划的题解方法:

    比较开心的是自己用动态规划完成了

    public boolean isMatch(String s, String p) {
            int m = s.length();
            int n = p.length();
            boolean[][] dp = new boolean[m+1][n+1];
            dp[0][0] = true;
            for(int j = 1;j<n+1;j++){
                if(p.charAt(j-1) == '*' && dp[0][j-1]){
                    dp[0][j] = true;
                }
            }
            for(int i = 1;i<m+1;i++){
                for(int j = 1;j<n+1;j++){
                    if(s.charAt(i-1) == p.charAt(j-1) || p.charAt(j-1) == '?'){
                        dp[i][j] = dp[i-1][j-1];
                    }else if(p.charAt(j-1) != '*' && s.charAt(i-1) != p.charAt(j-1)){
                        dp[i][j] = false;
                    }else if(p.charAt(j-1) == '*'){
                        dp[i][j] = dp[i-1][j] || dp[i][j-1];
                    }
                }
            }
            return dp[m][n];
        }

    ——2020.7.7

    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    LightOj 1016
    uva 127 "Accordian" Patience 简单模拟
    hdu 1180 诡异的楼梯 BFS + 优先队列
    UVALive 3907 Puzzle AC自动机+DP
    HDU 4001 To Miss Our Children Time DP
    HDU 4000 Fruit Ninja 树状数组
    hdu_1021_Fibonacci Again_201310232237
    hdu_1005_Number Sequence_201310222120
    hdu_1029-Ignatius and the Princess IV_201310180916
    hdu_1020_Encoding_201310172120
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/13246878.html
Copyright © 2020-2023  润新知