您的位置:首页 > 编程语言 > Java开发

[leetcode-44]Wildcard Matching(java)

2015-10-13 15:18 465 查看
问题描述: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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: