Wildcard Matching
'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
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];
}
}