可以想想一些问题可不可以转化为递归
要看一下尾递归转迭代!
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
class Solution {
public:
bool isMatch(const char *s, const char *p) {
if(s == NULL || p == NULL || *p == '*') {
return false;
}
if(*p == '\0') return *s == '\0';
//next char is not '*': must match current character
if(*(p+1) != '*') {
if(*s == '\0') return false;
if(*p != '.' && *p != *s) return false;
return isMatch(s+1,p+1);
}
//next char is '*'
else {
int slen = strlen(s);
if(isMatch(s,p+2)) return true;
for(int i = 0; i < slen; ++i) {
if(*p!='.' && *p != *(s+i)) return false;
if(isMatch(s+i+1,p+2)) return true;
}
return false;
}
}
};
int main() {
Solution solution;
char* s = "abcbcd";
char* p = "ab*bbc";
bool result = solution.isMatch(s,p);
cout<<result<<endl;
return 0;
}
我的java解法,注意的关键点为
注意在*的情况下字母相等和.的吞字母情况是不同的。.的情况是要迭代各种屯字母的个数,字母相同的情况是一个不吞字母,另一个是吞了一个字母。
另外一个注意的是当s长度为0的情况
public class Solution {
public boolean isMatch(String s, String p) {
return isMatchWithPointer(s, p, 0, 0);
}
public boolean isMatchWithPointer(String s, String p, int i, int j) {
if (j >= p.length()) {
if (i >= s.length()) {
return true;
} else {
return false;
}
}
if (j == p.length() - 1 || p.charAt(j+1) != '*') {
if (i >= s.length()) {
return false;
}
if (s.charAt(i) != p.charAt(j) && p.charAt(j) != '.') {
return false;
} else {
return isMatchWithPointer(s, p, i+1, j+1);
}
} else {
if (i >= s.length()) {
return (isMatchWithPointer(s, p, i, j+2));
}
if (s.charAt(i) == p.charAt(j) || p.charAt(j) == '.') {
// 需要注意以.开头和ij相等的情况要分别处理,在这里 就是要穷举*吞掉s字母的情形
if (p.charAt(j) == '.') {
for (int k = i; k <= s.length(); k++) {
if (isMatchWithPointer(s, p, k, j+2)) return true;
}
return false;
} else {
if (isMatchWithPointer(s, p, i, j+2)) return true;
if (isMatchWithPointer(s, p, i+1, j)) return true;
return false;
}
} else {
return isMatchWithPointer(s, p, i, j+2);
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。