bluecode-字符串最短循环子串

27 阅读1分钟

问题描述

小M在研究字符串时发现了一个有趣的现象:某些字符串是由一个较短的子串反复拼接而成的。如果能够找到这个最短的子串,便可以很好地还原字符串的结构。你的任务是给定一个字符串,判断它是否是由某个子串反复拼接而成的。如果是,输出该最短的子串;否则,输出空字符串""

例如:当输入字符串为 abababab 时,它可以由子串 ab 反复拼接而成,因此输出 ab;而如果输入 ab,则该字符串不能通过子串的重复拼接得到,因此输出空字符串。


测试样例

样例1:

输入:inp = "abcabcabcabc"
输出:'abc'

样例2:

输入:inp = "aaa"
输出:'a'

样例3:

输入:inp = "abababab"
输出:'ab'

样例4:

输入:inp = "ab"
输出:''

样例5:

输入:inp = "abcdabcdabcdabcd"
输出:'abcd'

样例6:

输入:inp = "b"
输出:''

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<int> compute_pi(const string &s) {
  int m = s.length();
  vector<int> pi(m);
  for (int i = 1; i < m; ++i) {
    int j = pi[i - 1];
    while (j > 0 && s[i] != s[j]) {
      j = pi[j - 1];
    }
    if (s[i] == s[j]) {
      ++j;
    }
    pi[i] = j;
  }
  return pi;
}

std::string solution(const std::string &inp) {
  int n = inp.length();
  if (n < 2) {
    return "";
  }
  vector<int> pi = compute_pi(inp);
  int len = n - pi[n - 1];
  if (pi[n - 1] > 0 && n % len == 0) {
    return inp.substr(0, len);
  }
  return "";
}

int main() {
  // Add your test cases here

  std::cout << (solution("abcabcabcabc") == "abc") << std::endl;
  return 0;
}

#include <iostream>
#include <string>
#include <vector>

using namespace std;

std::string solution(const std::string &inp) {
  int n = inp.length();
  if (n < 2) {
    return "";
  }

  for (int length = 1; length <= n / 2; ++length) {
    if (n % length == 0) {
      string substring = inp.substr(0, length);
      int repetitions = n / length;
      string constructed_string = "";
      for (int i = 0; i < repetitions; ++i) {
        constructed_string += substring;
      }
      if (constructed_string == inp) {
        return substring;
      }
    }
  }
  return "";
}

int main() {
  // Add your test cases here

  std::cout << (solution("abcabcabcabc") == "abc") << std::endl;
  return 0;
}