给定一个字符串,找到最大相等子串数的最优化解决方案是什么?例如,“aaaa”由四个相等的子串“a”组成,或者“abab”由两个“ab”组成。但是对于像“abcd”这样的东西,没有任何子串,但是“abcd”在连接到自身时会组成“abcd”。
检查所有可能的子字符串不是一个解决方案,因为输入可以是一个长度为100万的字符串。
答案 0 :(得分:0)
由于子串没有给定的条件,找到最大相等子串数的优化解决方案是计算最短的可能字符串,字母。创建一个地图并计算字符串的字母。找到最大数字的字母。这是你的解决方案。
编辑:
如果字符串必须只包含子字符串,则以下代码计算解决方案
#include <iostream>
#include <string>
using ull = unsigned long long;
int main() {
std::string str = "abab";
ull length = str.length();
for (ull i = 1; (2 * i) <= str.length() && str.length() % i == 0; ++i) {
bool found = true;
for (ull j = 1; (j * i) < str.length(); ++j) {
for (ull k = 0; k < i; ++k) {
if(str[k] != str[k + j * i]) {
found = false;
}
}
}
if(found) {
length = i;
break;
}
}
std::cout << "Maximal number: " << str.length() / length << std::endl;
return 0;
}
此算法检查字符串的头部是否重复,以及字符串是否仅包含重复的头部。
i
- 循环遍历头部的长度,
j
- 循环迭代每次重复,
k
- 循环遍历子字符串中的每个字符