打印可重复的最小字符串以获取原始字符串

时间:2017-07-09 12:52:44

标签: c++ string

示例输入
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;
} 

请建议正确的方法

1 个答案:

答案 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;
}