[leetcode-44]Wildcard Matching(java)

问题描述:https://leetcode.com/problems/wildcard-matching/

分析:这道题之前做过,再做发现还是没想到这个思路。最开始的思路还是使用回溯法,但是会发生超时。
我们再来仔细分析一下这样的结构。
p : abcd*def* ass*sss。这样的匹配实际上就是要查找字符串s中是否有如下按照一定顺序的序列:abcd、def、ass和sss。只有这四个字符串按照顺序出现,那么就匹配成功。这个很关键。
这样一来,如果我们匹配到abcd*def*ass时,下一个字符是,然后把这个 继续展开,那么前面的这几个还需要进一步展开吗?当然不需要了。因为他们的目的已经实现了,就是已经找到了前几个可以匹配的字符。现在需要的就是在sIndex之后的字符串s中,找到是否有sss这个字符串,而这个匹配的工作,由最后这个 已经完全可以胜任了。那么有没有可能是后面的字符串中没有sss,而在前面出现呢?即使有可能也没用,因为还有一个重要的前提是,有序。

因此这样一来的话,就可以使用迭代法。每次遇到不满足条件的时候就回溯,每次遇到*时就更新回溯点。

代码如下:

public class Solution {
    public boolean isMatch(String s, String p) {
        char[] chars = s.toCharArray();
        char[] charp = p.toCharArray();

        int ss = -1,pp = -1;
        int sIndex = 0,pIndex = 0;

        while(sIndex<chars.length){
            if(pIndex == charp.length){//false,回溯
                if(pp == -1) return false;

                pIndex = pp+1; sIndex = ss++;
            }
            else if(charp[pIndex] == '?' || chars[sIndex] == charp[pIndex]){//相同
                pIndex++;sIndex++;
            }else if(charp[pIndex] == '*'){
                pp = pIndex;ss = sIndex;pIndex = pp+1;
            }else{
                if(pp == -1) return false;
                pIndex = pp+1;sIndex = ss++;
            }
        }
        while(pIndex<charp.length){
            if(charp[pIndex] != '*')
                break;
            pIndex++;
        }
        return pIndex == charp.length; 
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值