刚开始很奇怪为什么这个题的标签是困难,然后写了出来发现我写出来的只针对从头到尾都一样,而不是如示例4,可以匹配一部分。
示例 4:
输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
只针对从头到尾相同的字符串的程序奉上,可能会有用,本题中通过了 357 / 447 个测试用例
class Solution {
public:
bool isMatch(string s, string p) {
bool Match=true;
int i=0,j=0; //表示匹配到当前的第i/j个位置
int lens=s.length(),lenp=p.length();
while(i<lens || j<lenp){
if(p[j]=='.' || p[j]==s[i]){ //匹配任意单个字符
i++,j++;
}
else if(p[j]=='*'){
char temp=p[j-1];
if(p[j-1]=='.'){
return Match;
}
while(temp==s[i]){
i++;
}
j++;
}
else if(p[j]!=s[i]){
Match=false;
break;
}
}
return Match;
}
};
正解:
捣乱的java
class Solution {
public boolean isMatch(String s, String p) {
return s.matches(p);
}
}
c++
学会使用string的substr函数
这个答案也不对,,,,我已经不太理解题目的意思了、
分为下边几部分
p为空
p长为1
p长为2且第二个字符是‘*’
p长为2且第二个字符不是‘*“
class Solution {
public:
bool isMatch(string s, string p)
{
int lenp=p.length();
for(int i=0;i<lenp-1;i++){
if(p[i]=='.'&& p[i+1]=='*'){
return true;
}
}
if(p.empty()){
return s.empty();
}
else if(p.length()==1){
return (s.length()==1&&(s[0]==p[0]||p[0]=='.'));
}
else if(p[1]!='*'){ //p长>=2且第二个字符不是*
if(s.empty()){ //在同时去掉第一个字符的过程中,p如果为空会被第一个if发现,但是s.empty(),必须单独另作处理
return false;
}
return ((s[0]==p[0]||p[0]=='.')&&isMatch(s.substr(1),p.substr(1)));
}
else{ //p长为2且第二个字符是*
while(!s.empty() && (p[0]==s[0] || p[0]=='.')){
s=s.substr(1);
if(isMatch(s,p.substr(2))||isMatch(s,p)){ //*代表0个字符或*代表多个字符,所以s一直去掉前边那个字符,而p不动,一直用*前边的字符和s比较
return true;
}
}
return isMatch(s,p.substr(2));
}
}
};