重复的子字符串(C++)

题目:给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

leetcode链接

示例 1:
输入: s = “abab”
输出: true
解释: 可由子串 “ab” 重复两次构成。

示例 2:
输入: s = “aba”
输出: false

示例 3:
输入: s = “abcabcabcabc”
输出: true
解释: 可由子串 “abc” 重复四次构成。 (或子串 “abcabc” 重复两次构成。)

思路:这道题可以用KMP算法解决,KMP算法详细介绍可查看代码随想录实现strStr。建立一个next前缀表,如果字符串是由它的子串重复构成,那么next前缀表里最后一个值加一,就是此字符串最长相同前后缀的长度,用字符串长度减去最长相同前后缀的长度,得到的差值如果能被字符串长度整除,说明该字符串由它的子串重复构成。

代码:

class Solution {	//重复的子字符串
public:
	void getNext(vector<int>& next, string s) {
		int j = -1;
		next[0] = j;
		for (int i = 1; i < s.size(); ++i) {
			while (j >= 0 && s[i] != s[j + 1]) {
				j = next[j];
			}
			if (s[i] == s[j + 1]) {
				j++;
			}
			next[i] = j;
		}
	}
	bool repeatedSubstringPattern(string s) {
		int len = s.size();
		if (len == 0) {
			return false;
		}
		vector<int> next(len);
		getNext(next, s);
		if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0) {
			return true;
		}
		return false;
	}
};

int main() {
	string s = "abcabcabcabc";
	Solution solution;
	bool result = solution.repeatedSubstringPattern(s);
	cout << result << endl;
	return 0;
}

你可能感兴趣的:(leetcode题,c++,leetcode,算法)