力扣 0459 重复的子字符串

警告
本文最后更新于 2022-08-07,文中内容可能已过时。

459. 重复的子字符串

若满足题意,则字符串 $s$ 可以写成 $s_1s_1 \cdots s_1$,其中 $s_1$ 的数量为 $k$,则 $n = k * m \ (2 \le k)$,$1 \le m \le \frac{n}{2}$,其中 $n$ 为字符串 $s$ 的长度,$m$ 为子串 $s_1$ 的长度。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class Solution {
    public boolean repeatedSubstringPattern(String s) {
        int n = s.length();
        for (int len = 1; len * 2 <= n; len++) { // 枚举子串长度
            if (n % len != 0) continue; // 剪枝
            int i;
            for (i = len; i < n; i++)
                if (s.charAt(i - len) != s.charAt(i)) break;
            if (i == n) return true;
        }
        return false;
    }
}

若满足要求,则字符串 $s$ 至少可以写成 $s_1s_1$,将两个 $s$ 前后拼接在一起得到 $ss = s_1s_1s_1s_1$,去掉 $ss$ 的首字符和末尾字符得到 $ss_1 = s_2s_1s_1s_2$,则字符串 $s$ 一定是 $ss_1$ 的子串。

1
2
3
4
5
class Solution {
    public boolean repeatedSubstringPattern(String s) {
        return (s + s).indexOf(s, 1) != s.length();
    }
}