leetcode 459. 重复的子字符串

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:

输入: "abab"

输出: True

解释: 可由子字符串 "ab" 重复两次构成。
示例 2:

输入: "aba"

输出: False
示例 3:

输入: "abcabcabcabc"

输出: True

解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/repeated-substring-pattern
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

1:获取字符串最后一个字符 end, 遍历字符串,寻找==end的索引位置位n。

2:把 从0 到n的字符串当作潜在的子串str。从n之后遍历 是否都是str的循环。

  

    public boolean repeatedSubstringPattern(String s) {
        int length = s.length();
        char[] arr = s.toCharArray();

        char end =arr[length - 1];
        int n = find(0,arr,  end);

        int index = 0;
        for (int i = n; i < length; i++) {
            if (arr[i] != arr[index++]) {
                n = find(i - index + 1, arr, end);
                i = n - 1;
                index = 0;
            }
            if (index == n) {
                index = 0;
            }
        }

        return n != length;

    }

    private int find(int start, char[] arr, char end) {
        int length = arr.length;
        int n = 1;
        for (int i = start; i < length; i++) {
            if (arr[i] == end && length % (i + 1) == 0) {
                n = i + 1;
                break;
            }
        }
        return n;
    }

若不是,则从n 之后继续寻找值为end的位置,替换为n,重复上面步骤。

3:最后判断n != length并返回。

 

posted @ 2021-06-28 11:20  旺仔古李  阅读(53)  评论(0)    收藏  举报