28. 实现strStr() - LeetCode

28. 实现strStr()

题目链接

双指针

class Solution {
    public int strStr(String haystack, String needle) {
        if(needle.length() == 0) return 0;
        int len1 = haystack.length();
        int len2 = needle.length();
        for(int i = 0; i < len1 - len2 + 1; i++){
            boolean flag = true;
            for(int j = 0; j < len2; j++)
                if(haystack.charAt(i+j) != needle.charAt(j)){
                    flag = false;
                    break;
                }
            if(flag) return i;
        }
        return -1;
    }
}
  • 另有将字符串中字母转为数字,在常数时间内求得子串哈希值,进行比较的方法,但局限较大,字符串中的字符必须为小写字母

KMP算法

class Solution {
    public int strStr(String haystack, String needle) {
        if(needle.length() == 0) return 0;
        String pat = needle;
        int M = pat.length();
        int R = 26;
        int[][] dfa = new int[R][M];
        dfa[pat.charAt(0) - 'a'][0] = 1;
        for(int X = 0, j = 1; j < M; j++){
            for(int c = 0; c < R; c++)
                dfa[c][j] = dfa[c][X];
            dfa[pat.charAt(j) - 'a'][j] = j+1;
            X = dfa[pat.charAt(j) - 'a'][X];
        }
        String txt = haystack;
        int i, j, N = txt.length();
        for(i = 0, j = 0; i < N && j < M; i++)
            j = dfa[txt.charAt(i) - 'a'][j];
        if(j == M) return i-M;
        else return -1;
    }
}
  • 可能是题目中的N相对较小,MR相对较大,用时反而更久
posted @ 2021-02-11 09:52  一天到晚睡觉的鱼  阅读(46)  评论(0)    收藏  举报