现代诗如蚯蚓
Description
现代诗如蚯蚓
断成好几截都不会死
字符串断成好几截
有可能完全一样
请编写程序
输入字符串
输出该字符串最多能断成多少截完全一样的子串
Input
一行,一个字符串
Output
一行,一个正整数表示该字符串最多能断成的截数
Sample Input 1
abcabcabcabc
Sample Output 1
4
Hint
HINT:时间限制:1.0s 内存限制:256.0MB
最多能断成四个”abc”,也就是abc重复四遍便是原串
同时也能断成两个”abcabc”
最坏情况是断成一个原串”abcabcabcabc”
我的第一版代码:
(思路是用双指针依次找字,总之分情况挺多的,结果是部分正确,如果要按这个方法需要分很多情况,不推荐)
#include <iostream>
using namespace std;
int main(){
string str;
cin >> str;
int left = 0,right = 1,ant = 0,ant1 = 0;
while(true){
if(str[left] == str[right]){
ant++;
if(right == str.length()-1) break;
right++;
}else{
int s = 0;
while(str[left] != str[right]){
s++;
if(right == str.length()-1){
s = 0;
break;
}
right++;
}
if(s == 0) break;
for(int i = s;i > 0;i--){
if(str[left+i] != str[right+s-i]){
break;
}
ant1++;
}
if(ant1 > ant) ant = ant1;
}
}
if(ant != 0) ant++;
cout << ant;
return 0;
}
AC代码参考:
#include<iostream>
using namespace std;
int main()
{
string s;
cin>>s;
int len=s.length();
int max=1;
for(int i=1;i<len;i++)//i为分组长度
{
if(len%i)
continue;
int step=len/i;//step为步长
int flag=1;
for(int j=0;j<len;j++)
{//对于每一组的固定位置元素,都要与第一组的比较
for(int k=j+step;k<len;k+=step)
{
if(s[j]!=s[k])
flag=0;
}
}
if(flag)//找最大的
{
if(max<i)
max=i;
}
}
cout<<max;
}