首页 新闻 会员 周边

给出一个由重复单词构成的字符串,求这个字符串中此重复单词重复的次数

0
悬赏园豆:60 [待解决问题]
BirthGrowupIllnessDeadBirthGrowupIllnessDead
ILoveUULoveWho
KaKaKaKa
如 第一个重复次数2
第二个1
第三个4
C语言或C++做

问题补充:

说下思路也行
闭关修炼的小孩纸的主页 闭关修炼的小孩纸 | 初学一级 | 园豆:142
提问于:2013-02-24 13:06
< >
分享
所有回答(5)
0

正则表达式,使用Match方法

陈希章 | 园豆:2538 (老鸟四级) | 2013-02-24 18:03
2

用正则表达式最简单了,你这个需求要用到后向应用,对于你这个例子,用到的正则表达式为^(.+?)\1*$。该表达式捕获的第一个组为重复的字符串,只要把字符串总长度除以该长度即为重复的次数。

如下是C#实现的示例。

    var text = "KaKaKaKa";
    var match = Regex.Match(text,(@"^(.+?)\1*$"));
    var repeatCount = text.Length / match.Groups[1].Value.Length;

    Console.WriteLine(repeatCount);

用c++实现的话,如果你用的是vs2012或gcc,则可以直接使用std::regex库,否则需要使用boost::regex库。代码实现如下。

    string input = "BirthGrowupIllnessDeadBirthGrowupIllnessDead";
    regex expression("^(.+?)\\1*$");

    smatch what;
    regex_match(input, what, expression);

    int repeat_count = input.length() / what[1].length();
    cout << repeat_count << endl;
天方 | 园豆:5407 (大侠五级) | 2013-02-24 19:24
0

是不是可以这样:

取第一个字符作为重复单词,与后面每个字符比较,如果第一个字符在后面字符中出现的次数大于0,取第二个字符,将第一个字符和第二个字符组成的字符串作为重复单词,再用看新的重复单词在后面的字符串中是否重复出现,如果重复出现,继续用已有重复加上下一个字符作为重复单词去比较;如果重复单词出现出现次数不大于0,舍弃上面的重复单词,取下一个字符作为重复单词,与其后面的字符串比较,依次类推。

RyanCheng | 园豆:474 (菜鸟二级) | 2013-02-25 09:55
0

我来说说我的看法。假如都是英文单词的话,看楼主的意思,应该是以大写字母开始,到另外一个大写字母为止表示一个单词,这样有办法把一个字符串切割成一个单词数组了。先把字符串转换为Char数组,根据ASCII码,大写字母是65-90,小写字母是97-122,这样可以找出所有大写字母的位置,进而切割成单词数组。

剩下的单词数组,想找出重复的单词那就太简单了。

林J | 园豆:202 (菜鸟二级) | 2013-03-05 13:59

贴个获取单词数组的代码吧,之后再获取重复个数很简单就不写了。

private static void Main()
        {
            string str = "BirthGrowupIllnessDeadBirthGrowupIllnessDeadILoveUULoveWhoKaKaKaKa";
            char[] strChar = str.ToArray();
            List<string> sList=new List<string>();
            int from = 0;
            for (int i = 0; i < strChar.Length;i++ )
            {
                if (64 < ((int)strChar[i]) && ((int)strChar[i]) < 91)
                {
                    if (from > 0 || (i != 0&&from==0))
                    {
                            sList.Add(str.Substring(from,i-from));
                            from = i;
                    }                   
                }
            }
            foreach (string s in sList)
            {
                Console.WriteLine(s);
                
            }
            Console.ReadLine();

        }
支持(0) 反对(0) 林J | 园豆:202 (菜鸟二级) | 2013-03-05 14:17
0

有个叫字典树的数据结构,应该可以解决这个问题。

把带匹配的字符串建立一个字典树,在原始串上扫一遍即可

之前经常写,现在忘了怎么写了。

fenix124 | 园豆:226 (菜鸟二级) | 2013-04-27 19:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册