自己哼哧哼哧做了好久,两个多小时,终于完成了。。。
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