459.Repeated Substring Pattern
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:
1 2 3
| Input: s = "abab" Output: true Explanation: It is the substring "ab" twice.
|
Example 2:
1 2
| Input: s = "aba" Output: false
|
Example 3:
1 2 3
| Input: s = "abcabcabcabc" Output: true Explanation: It is the substring "abc" four times or the substring "abcabc" twice.
|
枚举法:
时间复杂度:O(n^2)
空间复杂度:O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: bool repeatedSubstringPattern(string s) { int n = s.size(); for (int i = 1; i * 2 <= n; ++i) { if (n % i == 0) { bool match = true; for (int j = i; j < n; ++j) { if (s[j] != s[j - i]) { match = false; break; } } if (match) { return true; } } } return false; } };
|
字符串匹配:
1 2 3 4 5 6
| class Solution { public: bool repeatedSubstringPattern(string s) { return (s + s).find(s, 1) != s.size(); } };
|
KMP算法:
时间复杂度:O(n)
空间复杂度:O(n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class Solution { public: bool kmp(const string& query, const string& pattern) { int n = query.size(); int m = pattern.size(); vector<int> fail(m, -1); for (int i = 1; i < m; ++i) { int j = fail[i - 1]; while (j != -1 && pattern[j + 1] != pattern[i]) { j = fail[j]; } if (pattern[j + 1] == pattern[i]) { fail[i] = j + 1; } } int match = -1; for (int i = 1; i < n - 1; ++i) { while (match != -1 && pattern[match + 1] != query[i]) { match = fail[match]; } if (pattern[match + 1] == query[i]) { ++match; if (match == m - 1) { return true; } } } return false; }
bool repeatedSubstringPattern(string s) { return kmp(s + s, s); } };
|
优化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: bool kmp(const string& pattern) { int n = pattern.size(); vector<int> fail(n, -1); for (int i = 1; i < n; ++i) { int j = fail[i - 1]; while (j != -1 && pattern[j + 1] != pattern[i]) { j = fail[j]; } if (pattern[j + 1] == pattern[i]) { fail[i] = j + 1; } } return fail[n - 1] != -1 && n % (n - fail[n - 1] - 1) == 0; }
bool repeatedSubstringPattern(string s) { return kmp(s); } };
|