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

我的前方是万里征途,星辰大海!!
原文地址:https://www.cnblogs.com/taoyuxin/p/13246878.html