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

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;

    }
}

你可能感兴趣的:(LeetCode,字符串,KMP)