请使用C++语言的KMP算法帮我解答这道题:给定一个非空的字符串 s 检查是否可以通过由它的一个子串重复多次构成。
以下是C++代码实现KMP算法的解法:
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int n = s.size();
vector<int> next(n + 1, 0);
for (int i = 1, j = 0; i < n; i++) {
while (j > 0 && s[i] != s[j]) {
j = next[j];
}
if (s[i] == s[j]) {
j++;
}
next[i + 1] = j;
}
return next[n] && next[n] % (n - next[n]) == 0;
}
};
首先,我们使用KMP算法计算字符串的next数组。然后,我们检查next[n]是否为非零,并且(n - next[n])是否能够整除n。如果是,则说明字符串可以通过由它的一个子串重复多次构成。
原文地址: http://www.cveoy.top/t/topic/bnjI 著作权归作者所有。请勿转载和采集!