拆分字符串信息最大数量的相等子串

时间:2017-11-03 07:38:30

标签: c++ string

给定一个字符串,找到最大相等子串数的最优化解决方案是什么?例如,“aaaa”由四个相等的子串“a”组成,或者“abab”由两个“ab”组成。但是对于像“abcd”这样的东西,没有任何子串,但是“abcd”在连接到自身时会组成“abcd”。

检查所有可能的子字符串不是一个解决方案,因为输入可以是一个长度为100万的字符串。

1 个答案:

答案 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 - 循环遍历子字符串中的每个字符