isMatch("aab", "c*a*b") → false
思路:这题难度比较大,这个难度是指时间复杂度的难度,我用递归写的代码,正确性没问题,但是时间效率上简直不能忍。提交也果断不过。
我的代码如下(仅作为参考):
public class Solution { public boolean isMatch(String s, String p) { //边界条件判断 if (s.length() == 0) return p.length() == 0; if (p.length() == 0) return false; //如果为* if(p.charAt(0) == '*'){ int i = 1; while(i < p.length() && p.charAt(i) == '*'){ i++; } p = p.substring(i);//把*去掉是否还匹配 i = 0; while(s.length() > 0){ if(isMatch(s,p))//因为*匹配任意序列,故p与任意s匹配即可 return true; s = s.substring(1,s.length());//字符串每次截取1个,逐一尝试 } return isMatch(s,p);//如果都不匹配,此时s为空 }else{//如果不为*看s的第一个字符是否匹配 if(p.charAt(0) == '?' || s.charAt(0) == p.charAt(0)) return isMatch(s.substring(1,s.length()),p.substring(1,p.length())); return false;//不匹配返回false } } }在论坛上看的大神代码,可惜的时思想没有看懂,留待以后学习吧。
代码如下:
public class Solution { public boolean isMatch(String s, String p) { /** * 这是看到论坛上的人用DP的思想实现的 * 本人没有实现,用递归写虽然正确,但是TLE * 这一题我也没有彻底看懂本代码,只能先写到这里,以后再来学习 */ int m = s.length(), n = p.length(); int count = 0;//*的个数 for (int i = 0; i < n; i++) { if (p.charAt(i) == '*') count++;//统计*的个数 } if (count==0 && m != n) return false;//如果没有*且m!=n,肯定不匹配 else if (n - count > m) return false;//如果不是*的个数>m,则相等于没有*还是大于m,不匹配 boolean[] match = new boolean[m+1];//默认全为false match[0] = true;//第一个设为true for (int i = 0; i < n; i++) { if (p.charAt(i) == '*') {//如果为*,则s对应的之后所有数据默认匹配 for (int j = 0; j < m; j++) { match[j+1] = match[j] || match[j+1]; } } else {//如果不为*,则用最后一位匹配 for (int j = m-1; j >= 0; j--) { match[j+1] = (p.charAt(i) == '?' || p.charAt(i) == s.charAt(j)) && match[j]; } match[0] = false; } } return match[m]; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
leetCode 44.Wildcard Matching (通配符匹配) 解题思路和方法
原文地址:http://blog.csdn.net/xygy8860/article/details/46844611