代码随想录训练营第9天| 459.重复的子字符串、28.找出字符串中第一个匹配项的下标

459.重复的子字符串

题目链接:459. 重复的子字符串 - 力扣(LeetCode)

class Solution {
    public boolean repeatedSubstringPattern(String s) {
        return KMP((s+s).substring(1),s) != s.length() - 1;
    }
    private int KMP(String big, String small) {
        int slen = small.length();
        int blen = big.length();
        int[] pi = new int[slen];
        for(int i = 1,j = 0; i< slen; ++i) {
            while(j != 0 && small.charAt(j) != small.charAt(i)) {
                j = pi[j - 1];
            }
            if(small.charAt(j) == small.charAt(i)) {
                ++j;
            }
            pi[i] = j;
        }
        for(int i = 0, j = 0; i < blen; ++i) {
            while(j != 0 && small.charAt(j) != big.charAt(i)) {
                j = pi[j - 1];
            }
            if(small.charAt(j) == big.charAt(i)) {
                ++j;
            }
            if(j == slen) {
                return i - j + 1;
            }
        }
        return -1;
    }
}

28.找出字符串中第一个匹配项的下标

题目链接:28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)

class Solution {
    public int strStr(String haystack, String needle) {
        return KMP(haystack, needle);
    }
    private int KMP(String a, String b) {
        int alen = a.length(), blen = b.length();
        int[] pi = new int[blen];
        for(int i = 1,j = 0; i < blen; ++i) {
            while(j != 0 && b.charAt(j) != b.charAt(i)) {
                j = pi[j-1];
            }
            if(b.charAt(i) == b.charAt(j)) {
                ++j;
            }
            pi[i] = j;
        }
        for(int i = 0,j = 0; i < alen; ++i) {
            while(j != 0 && b.charAt(j) != a.charAt(i)) {
                j = pi[j-1];
            }
            if(b.charAt(j) == a.charAt(i)) {
                ++j;
            }
            if(j == blen) {
                return i - j + 1;
            }
        }
        return -1;
    }
}

你可能感兴趣的:(代码随想录训练营,算法,leetcode)