1 题目:

Implement strStr().

Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

Update (2014-11-02):
The signature of the function had been updated to return the index instead of the pointer. If you still see your function signature returns a char * or String, please click the reload button  to reset your code definition.

 

2 思路:

估计是要实现KMP算法。

正好我从大二就开始想把它看懂。。。

这次搞明白了。

我是 谷歌 “KMP 通俗”,前面有三个帖子,看完后,差不多才懂得。

 

3 代码:

    /* KMP method */
    // 
    public int strStr(String haystack, String needle) {
        // pre handle
        if( needle.length()==0){
            return 0;
        }
        if(haystack.length()==0){
            return -1;
        }
        
        char[] target = haystack.toCharArray();
        char[] point = needle.toCharArray();
    
        // build the point array, the last feature[len-1] not satify the sub-prifix & sub-suffix rule, but not matter,the feature[len-1] will not be use
        Integer[] feature = new Integer[needle.length()];
        feature[0] = 0;
        for(int i=1; i<needle.length()-1; i++){
            if(point[i]!=point[feature[i-1]]){
                feature[i] = 0;
            }else{
                feature[i] = feature[i-1]+1;
            }
        }
        
        // search
        int j = 0;
        for(int i=0; i<haystack.length();){
            if(target[i]==point[j]){
                j++;
                if(j == needle.length()){
                    // match, return index
                    return i-j+1;
                }
                i++;
            }else{
                if(j == 0){
                    /* j=0 not match,i++ */
                    i++;
                }else{
                    /* not match, continue to compare target[i] */
                    j = feature[j-1];
                }
            }
        }
        
        return -1;
    }