1. 程式人生 > 實用技巧 >leetcode——44.萬用字元匹配

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