LeetCode #28. Implement strStr() 子串查找 解题报告
2016-03-30 23:25
369 查看
1 解题思想
这道题嘛,说简单也简单,说难也难。。题目也就是给一个母串,给一个子串。。问你母串包含子串么?
1、说他简单,是因为我们可以暴力法解决,而且这道题的规模,用暴力反似乎更快。。。暴力法就是直接两个训话比较
2、说他难呢。。毕竟这种题目在公司里面面试,都会让你有KMP吧,KMP理论上效率更高
KMP么,就是要算NEXT数组等。。这个我真说不清楚了(要画好多图,做不到啊。。。你们网上搜一下,我这看代码吧)
这里只留个题外话,未经推倒。。不过实验证实
一般情况下,如果两个串的长度不是特别大。。情况不是特别糟。。没必要用KMP。。。KMP要有冗长的next创建过程。。而暴力法的最坏情况也很难达到。。实际就是暴力法处理一般的strstr问题反而更快。
据说java标准库里的strstr也没用KMP
2 原题
原题Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
3 暴力法
public class Solution { //Method1:非KMP public int strStr(String haystack, String needle) { char[] subject=haystack.toCharArray(); char[] pattern=needle.toCharArray(); for(int i=0;i<=subject.length-pattern.length;i++){ boolean flag=true; for(int j=0;j<pattern.length;j++){ if(subject[i+j]!=pattern[j]){ flag=false; break; } } if(flag) return i; } return -1; } }
4 KMP法
public class Solution { //这是KMP版本的,记得Next和Partial的计算 public int strStr(String haystack, String needle) { if(needle.equals("")) return 0; //Partial和Next数组 char sub[]=haystack.toCharArray(); char pat[]=needle.toCharArray(); int next[]=new int[pat.length]; int partial[]=new int[pat.length]; //计算部分匹配 for(int i=1;i<pat.length;i++){ if(pat[partial[i-1]]==pat[i]){ partial[i]=partial[i-1]+1; } } //计算Next数组 for(int i=0;i<pat.length;i++){ next[i]=i+1-partial[i]; } int p=0,q=0,index=0; //开始比对 while(p<=sub.length-pat.length){ index=-1; while(index<pat.length-1 && sub[index+1+p]==pat[index+1+q]){ index++; } if(index==pat.length-1) return p; else{ p=p+next[q]; q=partial[q]; } } return -1; } }
相关文章推荐
- 初学MongoDB
- 23种设计模式
- AngularJS 应用实例
- c++第二次实验
- IDEA快捷键 for Mac
- SICP(一):使用guile执行scheme代码
- iOS总结 - Block
- 安卓的一点小问题
- mybatis-redis项目分析
- spring同时集成redis和mongodb时遇到多个资源文件加载的问题
- Spring框架AOP
- Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对
- linux内核分析 第3章读书笔记
- mybatis-redis项目分析
- mybatis-redis项目分析
- Fantacy团队周一站立会议
- HDU 5299 (树删边博弈)
- 这是得了core dump综合征么?
- JDBC编程详解
- C/C++中的常量指针与指针常量