问题描述
- 输入一个字符串,判断其是否完全循环,若是循环的,输出最短的循环子串,否则输出空
"" - 如输入
abababab,输出ab;输入ab则输出""
输入格式
- 合法字符串 如
abcabcabcabcaaa
输出格式
- 最短的循环子串
"abc""a"
输入样例
"abcabcabcabc"
输出样例
"abc"
数据范围
测试数据集
#include <string>
std::string solution(const std::string &inp) {
int n = inp.size();
for (int len = 1; len <= n / 2; ++len) {
if (n % len == 0) {
std::string pattern = inp.substr(0, len);
bool isRepeating = true;
for (int i = 0; i < n; i += len) {
if (inp.substr(i, len) != pattern) {
isRepeating = false;
break;
}
}
if (isRepeating) {
return pattern;
}
}
}
return "";
}
int main() {
// Test cases
std::cout << (solution("abcabcabcabc") == "abc")
<< std::endl; // Expected: 1 (true)
std::cout << (solution("aaa") == "a") << std::endl; // Expected: 1 (true)
std::cout << (solution("ab") == "") << std::endl; // Expected: 1 (true)
std::cout << (solution("ababab") == "ab") << std::endl; // Expected: 1 (true)
std::cout << (solution("abcdef") == "") << std::endl; // Expected: 1 (true)
}
主要步骤
-
获取字符串长度:
- 使用
inp.size()获取输入字符串的长度,并存储在变量n中。
- 使用
-
循环尝试可能的子串长度:
- 使用
for循环从len = 1到len = n / 2,尝试所有可能的子串长度。
- 使用
-
检查子串是否能整除字符串长度:
- 如果
n % len == 0,说明当前的len可能是一个有效的循环子串长度。
- 如果
-
提取子串并检查重复性:
- 提取输入字符串的前
len个字符作为可能的循环子串pattern。 - 使用
for循环检查inp是否由pattern重复构成。
- 提取输入字符串的前
-
返回结果:
- 如果找到重复的子串,返回该子串
pattern。 - 如果循环结束仍未找到重复子串,返回空字符串
""。
- 如果找到重复的子串,返回该子串
测试部分
- 在
main函数中,定义了多个测试用例,并输出测试结果。
代码分析
#include <iostream> #include <string>
- 这两行代码包含了标准库的头文件。
<iostream>用于输入输出操作,<string>用于处理字符串。 - 定义了一个名为
solution的函数,该函数接受一个常量引用inp作为参数,返回一个std::string类型的值。 - 获取输入字符串
inp的长度,并将其存储在变量n中。 - 开始一个
for循环,len从 1 开始,直到n / 2结束。len表示可能的循环子串的长度。 - 检查
n是否能被len整除。如果可以,说明len可能是一个有效的循环子串长度。 - 提取
inp的前len个字符作为可能的循环子串pattern。 - 初始化一个布尔变量
isRepeating为true,假设pattern是重复的。 - 开始一个
for循环,i从 0 开始,每次增加len,直到n结束。 - 检查
inp从位置i开始的len个字符是否等于pattern。 - 如果不相等,将
isRepeating设为false。 - 如果
isRepeating为true,说明pattern是重复的。
// Test cases
std::cout << (solution("abcabcabcabc") == "abc")
<< std::endl; // Expected: 1 (true)
std::cout << (solution("aaa") == "a") << std::endl; // Expected: 1 (true)
std::cout << (solution("ab") == "") << std::endl; // Expected: 1 (true)
std::cout << (solution("ababab") == "ab") << std::endl; // Expected: 1 (true)
std::cout << (solution("abcdef") == "") << std::endl; // Expected: 1 (true)
}
- 测试
solution函数,输出测试结果。