public class Solution {
public boolean match(char[] str, char[] pattern)//本题注意str不含'.'和'*'
{
int l1=str.length;
int l2=pattern.length;
return dfs(str,0,l1,pattern,0,l2);//此题利用递归来实现
}
boolean dfs(char []str,int k1,int l1,char []pattern,int k2,int l2){//k1是str的起始位置,l1是长度,k2是pattern的起始位置,l2是长度
if(k1==l1&&k2==l2)return true;//两者同时遍历到头,字符串匹配
if(k1==l1){//如果str已经遍历完,看pattern剩余部分是不是利用'*'的特性,可以变为空串
for(int i=k2;i<l2;i++){
if(pattern[i]!='*'&&(i+1==l2||pattern[i+1]!='*'))
return false;
}
return true;
}
if(k2==l2) return false;//如果pattern遍历完,str没有遍历完,两者不匹配
if(k2!=l2-1&&pattern[k2+1]=='*'){//当pattern的下一位元素为*
boolean flag1=false;
boolean flag2=false;
boolean flag0=dfs(str,k1,l1,pattern,k2+2,l2);///0 *前面字符出现0次
if(pattern[k2]=='.'||str[k1]==pattern[k2]){//当前比较元素相同
flag1=dfs(str,k1+1,l1,pattern,k2+2,l2);//1 *前面字符出现0次
flag2=dfs(str,k1+1,l1,pattern,k2,l2);///2..3..n *前面字符出现大于等于2次
}
return flag0||flag1||flag2;///三种情况只要一种匹配即可
}
else{//当pattern的下一位元素不为*,正常比较即可
if(pattern[k2]!='.'&&str[k1]!=pattern[k2])
return false;
return dfs(str,k1+1,l1,pattern,k2+1,l2);
}
}
}
正则表达式匹配
最新推荐文章于 2023-07-18 13:32:00 发布