模糊搜索验证

请设计一个程序来支持用户在文本编辑器中的模糊搜索功能。用户输入内容中可能使用到如下两种通配符:

  • '.' 匹配任意单个字符。
  • '*' 匹配零个或多个前面的那一个元素。

请返回用户输入内容 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;
    }
}

ced3787356244ed198e41c44a2383f8d.png 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绚烂的萤火

互相学习,共同成长!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值