Description
Given a non-empty string check if it can be constructed by taking a substring of it and appending multiple copies of the substring together. You may assume the given string consists of lowercase English letters only and its length will not exceed 10000.
Example
Example 1:
Input: "abab"
Output: True
Explanation: It's the substring "ab" twice.
Example 2:
Input: "aba"
Output: False
Example 3:
Input: "abcabcabcabc"
Output: True
Explanation: It's the substring "abc" four times.
(And the substring "abcabc" twice.)
Solution
- The repeating substring’s length must be the divisor of string s’s length, so we could find its divisor first.
- When we find its divisor, get the substring and compare it with string s to judge the substring is the loop part of string s or not.
class Solution {
public boolean repeatedSubstringPattern(String s) {
int len = s.length();
for (int i = len / 2; i >= 1; i --) {
// the repeating substring's length must be the divisor of s's length
if (len % i == 0) {
// calculate the repeating time
int repeatTime = len / i, pos;
String subStr = s.substring(0, i);
// compare subStr with s to judge it's repeating or not
for (pos = 1; pos < repeatTime; pos ++)
// it's not repeating and continue to find the substring
if (!subStr.equals(s.substring(pos * i, (pos + 1) * i)))
break;
if (pos == repeatTime) return true;
}
}
return false;
}
}