请设计一个程序来支持用户在文本编辑器中的模糊搜索功能。用户输入内容中可能使用到如下两种通配符:
'.'
匹配任意单个字符。'*'
匹配零个或多个前面的那一个元素。
请返回用户输入内容 input
所有字符是否可以匹配原文字符串 article
。
示例 1:
输入: article = "aa", input = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:
输入: article = "aa", input = "a*" 输出: true 解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3:
输入: article = "ab", input = ".*" 输出: true 解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
提示:
1 <= article.length <= 20
1 <= input.length <= 20
article
只包含从a-z
的小写字母。input
只包含从a-z
的小写字母,以及字符.
和*
。- 保证每次出现字符
*
时,前面都匹配到有效的字符
题解:
实现原理
1.当前匹配的表达式的下一位是*时,字符串有下一位且(当前这一位能匹配 或 正则表达式为.),匹配s p+2或s+1 p;如果不符合,匹配s p+2。
2.字符串有下一位且(当前表达式为. 或 当前位可以匹配时),匹配s+1 p+1
class Solution {
public boolean isMatch(String s, String p) {
if(s==null||p==null)
return false;
char[] s1=s.toCharArray();
char[] p1=p.toCharArray();
return match(s1,p1,0,0);
}
public boolean match(char[] s1, char[] p1,int str,int pat){
if(pat==p1.length)
return str==s1.length;
if(pat+1<p1.length && p1[pat+1]=='*'){
if(s1.length>str&&(p1[pat]==s1[str]||p1[pat]=='.')){
return match(s1,p1,str,pat+2)||match(s1,p1,str+1,pat);
}
return match(s1,p1,str,pat+2);
}
if(s1.length>str&&(p1[pat]=='.'||p1[pat]==s1[str]))
return match(s1,p1,str+1,pat+1);
return false;
}
}