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

Splitting a string info maximum number of equal substrings

本文关键字:字符串 信息 拆分      更新时间:2023-10-16

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

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

由于子字符串没有给定的条件,因此找到最大数量的相等子字符串的优化解决方案是计算尽可能短的字符串,字母。创建一个映射并计算字符串的字母。找到具有最大数量的字母。这就是你的解决方案。

编辑:

如果字符串必须仅包含子字符串,则以下代码将计算解决方案

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