LeetCode #28. Implement strStr() 子串查找 解题报告

来源:互联网 发布:php.ini safe mode 编辑:程序博客网 时间:2024/05/22 03:48

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;    }}
0 0
原创粉丝点击