您的位置:首页 > 其它

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;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: