3. Longest Substring Without Repeating Characters:https://leetcode.com/problems/longest-substring-without-repeating-characters/
容器不熟
10. Regular Expression Matching:https://leetcode.com/problems/regular-expression-matching/
逻辑很乱,情况想不全。
本想用普通方法直接写出规则,发现卡在样例:s="aaa", p="a*a" 上不能解决了。
这是卡住的代码:
class Solution {
public:
bool isMatch(string s, string p) {
int pi = 0, si = 0;
for (; si < s.size() && pi < p.size(); ++si){
printf("%c,%c\n",s[si],p[pi]);
if (s[si] == p[pi] || p[pi] == '.') ++pi;
else if (p[pi + 1] == '*') pi += 2;
else if (p[pi] == '*' && s[si] != s[si - 1] && p[pi - 1] != '.'){
++pi;
while (pi < p.size() && s[si] != p[pi] && p[pi] != '.'){
++pi;
if (pi >= p.size() || p[pi] != '*') return false;
else ++pi;
}
++pi;
}
}
if (si < s.size()) return false;
else if ((pi) < p.size()){
int tmp = (p.size() - pi - 1) % 2;
if (p[pi] == '*'){
if (tmp != 0 || !equalEmpty(p.substr(pi + 1))) return false;
}
else {
if (tmp != 0){
if (p[pi + 1] != '*') return false;
else if (!equalEmpty(p.substr(pi + 2))) return false;
}
else if (p[pi] != '*' || !equalEmpty(p.substr(pi + 1))) return false;
}
}
return true;
}
bool equalEmpty(string p){
if (p.size() % 2 != 0) return false;
for (int i = 0; i < p.size(); ++i){
if (p[++i] != '*') return false;
}
return true;
}
};
法一:递归,目前还没想清楚。
法二:dp,和初始想法有点像