459. Repeated Substring Pattern
Description
Given a string s, check if it can be constructed by taking a substring of it and appending multiple copies of the substring together.
Example 1:
Input: s = "abab" Output: true Explanation: It is the substring "ab" twice.
Example 2:
Input: s = "aba" Output: false
Example 3:
Input: s = "abcabcabcabc" Output: true Explanation: It is the substring "abc" four times or the substring "abcabc" twice.
Constraints:
1 <= s.length <= 104sconsists of lowercase English letters.
Solutions
Solution 1
Thinking
We ask whether \(s\) is a proper prefix repeated. Trying every prefix length is \(O(n^2)\).
Build \(s+s\) and search for \(s\) starting at index \(1\). A hit before \(n\) means \(s\) lines up inside the concatenation, hence a period exists.
Starting at \(1\) skips the trivial match at \(0\); a hit at \(n\) is only the middle copy, so there is no smaller period.
1 2 3 | |
1 2 3 4 5 6 | |
1 2 3 4 5 6 | |
1 2 3 | |
1 2 3 | |
1 2 3 4 5 | |