问题描述
小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;
}