给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘’ 的通配符匹配。
‘?’ 可以匹配任何单个字符。
'’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
原题链接:https://leetcode-cn.com/problems/wildcard-matching/
思路:dfs,与LeetCode10. 正则表达式匹配 类似,*的作用域换成了可以匹配任意字符串(包括空字符串)。只是搜索时间太多,因此增加了记忆化
class Solution {
public boolean isMatch(String s, String p) {
memo=new Boolean[s.length()+1][p.length()+1];
return dfs(s,p,0,0);
}
Boolean memo[][];
//sin->s当前的位置,pin->p当前的位置
public Boolean dfs(String s,String p,int sin,int pin)
{
if(memo[sin][pin]!=null)
return memo[sin][pin];
if(sin==s.length() && pin==p.length())
{
return memo[sin][pin]=true;
}
if(pin==p.length())
return memo[sin][pin]=false;
char b=p.charAt(pin);
if(p.charAt(pin)=='*')
{
if(dfs(s,p,sin,pin+1))//不加的情况
return memo[sin][pin]=true;
//下一位是*的情况
for(int i=sin;i<s.length();i++)
{
if(dfs(s,p,i+1,pin+1))
return memo[sin][pin]=true;
}
}else
{
if(sin==s.length())//放在这里避免p剩下*
return memo[sin][pin]=false;
char a=s.charAt(sin);
if(!f(a,b))
{
return memo[sin][pin]=false;
}
return memo[sin][pin]=dfs(s,p,sin+1,pin+1);
}
return memo[sin][pin]=false;
}
//比较是否相等
public boolean f(char a,char b)
{
if(b=='?')
return true;
return a==b;
}
}