正则表达式,使用Match方法
用正则表达式最简单了,你这个需求要用到后向应用,对于你这个例子,用到的正则表达式为^(.+?)\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;
是不是可以这样:
取第一个字符作为重复单词,与后面每个字符比较,如果第一个字符在后面字符中出现的次数大于0,取第二个字符,将第一个字符和第二个字符组成的字符串作为重复单词,再用看新的重复单词在后面的字符串中是否重复出现,如果重复出现,继续用已有重复加上下一个字符作为重复单词去比较;如果重复单词出现出现次数不大于0,舍弃上面的重复单词,取下一个字符作为重复单词,与其后面的字符串比较,依次类推。
我来说说我的看法。假如都是英文单词的话,看楼主的意思,应该是以大写字母开始,到另外一个大写字母为止表示一个单词,这样有办法把一个字符串切割成一个单词数组了。先把字符串转换为Char数组,根据ASCII码,大写字母是65-90,小写字母是97-122,这样可以找出所有大写字母的位置,进而切割成单词数组。
剩下的单词数组,想找出重复的单词那就太简单了。
贴个获取单词数组的代码吧,之后再获取重复个数很简单就不写了。
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(); }
有个叫字典树的数据结构,应该可以解决这个问题。
把带匹配的字符串建立一个字典树,在原始串上扫一遍即可
之前经常写,现在忘了怎么写了。