Leetcode题解 28. Implement strStr()

来源:互联网 发布:域名注册申请 编辑:程序博客网 时间:2024/05/20 16:08

Implement strStr().

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

解法一:(暴力法)

public class Solution {    public static int strStr(String haystack, String needle) {        int m = haystack.length();        int n = needle.length();        if(m==0&&n==0) return 0;        else if(m==0&&n!=0) return -1;        else if(m!=0&&n==0) return 0;        for(int i = 0; i <= m-n; i ++)        {            int j;            for(j = 0; j < n; j ++)            {                if(haystack.charAt(i+j) == needle.charAt(j)){                    if(j == n-1)                       return i;                }                  else break;            }        }        return -1;    }}

解法二:(KMP算法)

public class Solution {    static int strStr(String haystack, String needle) {       int hlen = haystack.length();        int nlen = needle.length();        if(hlen==0&&nlen==0) return 0;        else if(hlen==0&&nlen!=0) return -1;        else if(hlen!=0&&nlen==0) return 0;        int[] next = new int[nlen];        getNext(needle, next);        int i = 0;        int j = 0;        while (i < hlen && j < nlen) {            if (j == -1 || haystack.charAt(i) == needle.charAt(j)) {// match current position, go next                i++;                j++;            } else {// jump to the previous position to try matching                j = next[j];            }        }        if (j == nlen)            // all match            return i - nlen;        else            return -1;    }    private static void getNext(String needle, int next[]) {// self match to contruct next array        int nlen = needle.length();        int j = -1;     // slow pointer        int i = 0;      // fast pointer        next[i] = -1;    //init next has one element        while (i < nlen - 1) {            if (j == -1 || needle.charAt(i) == needle.charAt(j)) {                j++;                i++;           //thus the condition (i < nlen-1)                next[i] = j;    //if position i not match, jump to position j            } else {                j = next[j];    //jump to the previous position to try matching            }        }    }}
0 0
原创粉丝点击