[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,而在前面出现呢?即使有可能也没用,因为还有一个重要的前提是,有序。
因此这样一来的话,就可以使用迭代法。每次遇到不满足条件的时候就回溯,每次遇到*时就更新回溯点。
代码如下:
分析:这道题之前做过,再做发现还是没想到这个思路。最开始的思路还是使用回溯法,但是会发生超时。
我们再来仔细分析一下这样的结构。
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; } }
相关文章推荐
- Java读写大文本文件(2GB以上)
- java 线程池
- javaEE学习笔记【03】XML操作
- Spring mvc 将请求后缀改成.htm 后ajax无法返回json的问题
- Struts2.2.1简单配制
- Eclipse/MyEclipse 添加src JAVA DOC XML提示
- Eclipse使用Maven构建web项目
- java参数的传递方式
- JAVA中处理ASCII 160 的char
- Spring security oauth2最简单入门环境搭建--二、干货
- Spring security oauth2最简单入门环境搭建--一、OAuth简介
- 使用maven+eclipse搭建Spring mvc+security的tutorial环境
- Java类的初始化
- java.lang.NoSuchFieldError
- 转:64位eclipse安装JD反编译插件报错
- 分享:某单位Java笔试题(二)
- 分享:某单位Java笔试题(一)
- 备忘:Java并发/多线程介绍
- Eclipse Hover 提示过快
- win7 Eclipse Indigo Courier New 字体问题