Leetcode--RegularExpressionMatching
2015-06-08 19:40
281 查看
可以把问题简化成如下的递归形式
d[i][j]表示String s[0...i]与Pattern p[0...j]是否匹配
case1:p[j+1]!='*', 比较s[i]与p[j]。if(s[i]==p[j])d[i][j]=d[i-1][j-1] else return false。如果p[j]==‘.’,那么作相等处理
case2:p[j+1]=='*',依次调用d[i][j-1],d[i-1][j-2]...d
[j-2]直到没有可以匹配的s[i]。如果在此期间匹配则返回true,不然调用d[n-1][j-2]
public boolean isMatch(String s, String p) {
return ismatch(s,s.length()-1,p,p.length()-1);
}
public boolean ismatch(String s,int sindex,String p,int pindex){
if(sindex>=0&&pindex<0)return false;
if(sindex<0&&pindex<0)return true;
if(sindex<0)return isNull2(p,pindex);
if(sindex>=0){
if(p.charAt(pindex)=='*')return ismatch(s,sindex,p,pindex-1);
else if(pindex==p.length()-1){
if(s.charAt(sindex)==p.charAt(pindex)||p.charAt(pindex)=='.')return ismatch(s,sindex-1,p,pindex-1);
else return false;
}
if(p.charAt(pindex+1)!='*'){
if(s.charAt(sindex)==p.charAt(pindex)||p.charAt(pindex)=='.')return ismatch(s,sindex-1,p,pindex-1);
else return false;
}else{
while(s.charAt(sindex)==p.charAt(pindex)||p.charAt(pindex)=='.'){
if(ismatch(s,sindex,p,pindex-1))return true;
sindex--;
if(sindex<0)break;
}
}
}
if(sindex>=0)return ismatch(s,sindex,p,pindex-1);
if(sindex<0&&isNull(p, pindex))return true;
if(sindex<0&&pindex>=0)return false;
return false;
}
public boolean isNull(String p,int pindex){
if(p.charAt(pindex)=='*') pindex--;
while(p.charAt(pindex+1)=='*'){
if(pindex==0)return true;
pindex=pindex-2;
}
return false;
}
public boolean isNull2(String p,int pindex){
pindex--;
while(p.charAt(pindex+1)=='*'){
if(pindex==0)return true;
pindex=pindex-2;
}
return false;
}
d[i][j]表示String s[0...i]与Pattern p[0...j]是否匹配
case1:p[j+1]!='*', 比较s[i]与p[j]。if(s[i]==p[j])d[i][j]=d[i-1][j-1] else return false。如果p[j]==‘.’,那么作相等处理
case2:p[j+1]=='*',依次调用d[i][j-1],d[i-1][j-2]...d
[j-2]直到没有可以匹配的s[i]。如果在此期间匹配则返回true,不然调用d[n-1][j-2]
public boolean isMatch(String s, String p) {
return ismatch(s,s.length()-1,p,p.length()-1);
}
public boolean ismatch(String s,int sindex,String p,int pindex){
if(sindex>=0&&pindex<0)return false;
if(sindex<0&&pindex<0)return true;
if(sindex<0)return isNull2(p,pindex);
if(sindex>=0){
if(p.charAt(pindex)=='*')return ismatch(s,sindex,p,pindex-1);
else if(pindex==p.length()-1){
if(s.charAt(sindex)==p.charAt(pindex)||p.charAt(pindex)=='.')return ismatch(s,sindex-1,p,pindex-1);
else return false;
}
if(p.charAt(pindex+1)!='*'){
if(s.charAt(sindex)==p.charAt(pindex)||p.charAt(pindex)=='.')return ismatch(s,sindex-1,p,pindex-1);
else return false;
}else{
while(s.charAt(sindex)==p.charAt(pindex)||p.charAt(pindex)=='.'){
if(ismatch(s,sindex,p,pindex-1))return true;
sindex--;
if(sindex<0)break;
}
}
}
if(sindex>=0)return ismatch(s,sindex,p,pindex-1);
if(sindex<0&&isNull(p, pindex))return true;
if(sindex<0&&pindex>=0)return false;
return false;
}
public boolean isNull(String p,int pindex){
if(p.charAt(pindex)=='*') pindex--;
while(p.charAt(pindex+1)=='*'){
if(pindex==0)return true;
pindex=pindex-2;
}
return false;
}
public boolean isNull2(String p,int pindex){
pindex--;
while(p.charAt(pindex+1)=='*'){
if(pindex==0)return true;
pindex=pindex-2;
}
return false;
}
相关文章推荐
- JavaScript中使用正则匹配多条,且获取每条中的分组数据
- PHP中preg_match函数正则匹配的字符串长度问题
- js正则匹配出所有图片及图片地址src的方法
- PHP中preg_match正则匹配中的/u、/i、/s含义
- Python使用正则匹配实现抓图代码分享
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解