给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
'’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
原题链接:https://leetcode-cn.com/problems/regular-expression-matching/
思路:dfs搜索,对*进行0个或多个匹配,其他情况直接比较相等
class Solution {
public boolean isMatch(String s, String p) {
result=false;
dfs(s,p,0,0);
return result;
}
boolean result;
//sin->s当前的位置,pin->p当前的位置
public void dfs(String s,String p,int sin,int pin)
{
if(sin==s.length() && pin==p.length())
{
result=true;
return;
}
if(pin==p.length())
return;
char b=p.charAt(pin);
//下一位是*的情况
if(pin+1<p.length() && p.charAt(pin+1)=='*')
{
dfs(s,p,sin,pin+2);//*匹配0次情况
//匹配多次
for(int i=sin;i<s.length();i++)
{
if(f(s.charAt(i),b))
{
dfs(s,p,i+1,pin+2);
}else
break;
}
}else
{
if(result)//避免结果被覆盖
return;
if(sin==s.length())//放在这里避免p剩下.*
return;
char a=s.charAt(sin);
if(!f(a,b))
{
result=false;
return;
}
dfs(s,p,sin+1,pin+1);
}
}
//比较是否相等
public boolean f(char a,char b)
{
if(b=='.')
return true;
return a==b;
}
}