示例输入
abababab
示例输出
ab
1 <= length of string <= 5000
我正在做的是记录每个角色的出现次数。然后我找到最小的非零事件,并将所有其他事件除以此数字。然后我添加了所有内容,这给了我打印原始字符串所需的长度,以便给出答案
在样本输入中,a = 4,b = 4。所以最小的出现次数为4,除法之后我得到a = 1,b = 1并且加法得到2.我将从原始字符串打印前2,得到ab
。
我甚至尝试了更复杂的例子,这个算法似乎完美无缺,但我仍然得到一些错误的测试用例。
#include <cmath>
#include <cstdio>
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
char str[5005];
int letters[26] = {0}, min = 10000, len=0;
cin>>str;
int lent = strlen(str);
if(lent==1)
{
cout<<str;
return 0;
}
for(int i=0; i<lent; i++)
letters[(int)str[i]-97]++;
for(int i=0; i<26; i++)
{
if(letters[i]>0)
{
if(letters[i]<min)min=letters[i];
}
}
for(int i=0; i<26; i++)
{
len+= letters[i]/min;
}
for(int i=0; i<len; i++)
cout<<str[i];
return 0;
}
请建议正确的方法
答案 0 :(得分:-1)
正如Ryan和Hagen von Eitzen在评论中提供的样本输入所指出的那样,并使用WhozCraig给出的提示我终于能够得到正确的方法。
#include <cmath>
#include <cstdio>
#include <string.h>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
string str;
int letters[26] = {0}, min = 10000, len=0;
cin>>str;
int lent = str.size();
len = lent;
for(int i=1; i<=lent; i++)
{
string temp = "";
string ans = "";
if(lent%i == 0)
{
for(int j=0; j<i; j++)
ans+=str[j];
for(int j=0; j<(lent/i); j++)
temp+=ans;
if(str==temp)
{
cout<<ans;
return 0;
}
}
}
return 0;
}