测试字符串中的重复字符包含重复的字符。`ABCDE`//不包含重复`AABCD`//确实包含重复,即A被重复遗漏了一些明显的东西……也许我只需要咖啡。有人可以帮忙吗?编辑:字符串将被排序,所以顺序无关紧要,ABCDA=>AABCD重复的频率也是如此,所以我需要知道重复是两倍还是三倍等。如果字符串很短,它可能是最简单和最高效地循环和测试。我的意思是你可以创建一个哈希集(在你使用的任何平台上)并迭代字符,如果字符已经在集合中并将其添加到集合中则失败-但这只会为字符串提供更长的任何好处。编辑:现在我们知道了,mquander的回答是IMO最好的回答。这是一个实现:publicstaticboolIsSortedNoRepeats(stringtext){if(text.Length==0){returntrue;}charcurrent=文本[0];for(inti=1;i如果你不介意重用索引器,你可以选择一个更短的替代方案:publicstaticboolIsSortedNoRepeats(stringtext){for(inti=1;i编辑:好的,使用“频率”方面,我会把问题转过来。我仍然会假设字符串已经排序,所以我们想知道的是最长运行的长度。当没有重复时,最长运行长度将为0(对于空字符串)或1(对于非空字符串)。否则,它将是2或更多。首先是特定于字符串的版本:publicstaticintLongestRun(stringtext){if(text.Length==0){return0;}charcurrent=文本[0];intcurrentRun=1;intbestRun=0;for(inti=1;i现在我们也可以将其用作IEnumerable的通用扩展方法:publicstaticintLongestRun(thisIEnumerablesource){boolfirst=true;Tcurrent=default(T);intcurrentRun=0;intbestRun=0;foreach(Telementinsource){if(first||!EqualityComparer.Default(element,current)){first=false;bestRun=Math.Max(currentRun,bestRun);currentRun=0;current=element;}}//有可能最后的run是最好的returnMath.Max(currentRun,bestRun);}那么你可以调用"AABCD".LongestRun()作为例子,如果字符串是排序的,你可以记录每个字符并检查以确保下一个字符永远不会与上一个字符相同。除此之外,对于十个字符以下的字符串,只需针对所有其他字符测试每个字符,可能与大多数其他字符一样快或一样快。另一位评论者建议的位向量可能更快(如果您有一小部分合法字符,则会有所帮助。)奖励:这是实现Jonfunction的灵活LINQ解决方案:intlongestRun=s.Select((c,i)=>s.Substring(i).TakeWhile(x=>x==c).Count())。最大限度();所以,好吧,它不是很快!你怎么看待这件事?!?这将告诉您字符串是否包含重复项:boolcontainsDups="ABCDEA".Length!=s.Distinct().Count();它只是根据原始长度检查不同字符的数量。如果它们不同,你有重复......编辑:我想这没有考虑你在编辑中注意到的重复频率......但这里的其他一些建议已经解决了这个问题,所以我不会发布代码,因为我注意到转到其中一些已经为您提供了一个相当优雅的解决方案。我特别喜欢Joe使用LINQ扩展的实现。由于您使用的是3.5,您可以在一个LINQ查询中执行此操作:varresults=stringInput.ToCharArray()//实际上不需要,我将其留在此处以显示实际发生的情况.GroupBy(c=>c)。Where(g=>g.Count()>1).Select(g=>new{Letter=g.First(),Count=g.Count()});字符,这将为您提供字符和出现次数。我认为最简单的方法是使用这个简单的正则表达式boolfoundMatch=false;foundMatch=Regex.IsMatch(yourString,@"(w)1");如果您需要有关匹配的更多信息(开始、长度等)Matchmatch=null;stringtestString="ABCDEAABCD";match=Regex.Match(testString,@"(w)1+?");如果(匹配成功){字符串匹配文本=匹配值;//AAintmatchIndnex=match.Index;//6intmatchLength=match.Length;//2}立即更新,需要一个计数器数组来维护计数。保存一个位数组,一位代表一个唯一的字符。遇到字符就打开,对字符串运行一次。位数组索引和字符集的映射由您决定。如果您已经看到某个特定位已打开,请中断。怎么样:stringstrStrString="AABRAKADABRA";vargrp=fromcinstrString.ToCharArray()将c按c分组为mselectnew{Key=m.Key,Count=m.Count()};foreach(varitemingrp){Console.WriteLine(string.Format("字符:{0}出现{1}次",item.Key.ToString(),item.Count));}/(.).*1/(或正则表达式库语法中的等效项)不是最有效的,因为它可能回溯到字符串中的每个字符,然后再次向前扫描。我通常不提倡正则表达式。但是如果你想要简洁......我开始在网上寻找一些信息并且我得到了以下解决方案。字符串输入=“aaaaabbcbbbccccddefgg”;char[]chars=input.ToCharArray();字典dictionary=newDictionary();foreach(charcinchars){if(!dictionary.ContainsKey(c)){dictionary[c]=1;//}else{字典[c]++;}}foreach(KeyValuePaircomboindictionary){if(combo.Value>1)//如果key的值大于1表示字母重复{Console.WriteLine("Letter"+combo.Key+""+"重复"+combo.Value.ToString()+"次");我希望它有所帮助,我接受了采访,采访官员让我解决这个问题,我知道这是一个常见问题。如果没有订单可用,您可以使用字典来保存计数:Stringinput="AABCD";varresult=newDictionary(26);varchars=input.ToCharArray();foreach(varcinchars){if(!result.ContainsKey(c)){result[c]=0;//初始化结果中的计数器}result[c]++;}foreach(varcharComboinresult){Console.WriteLine("{0}:{1}",charCombo.Key,charCombo.Value);}Jon描述的散列解决方案可能是最好的。您可以使用HybridDictionary,因为它适用于小型和大型数据集。字母是键,值是频率。(每次加法失败更新频率,或者HybridDictionary对.Contains(key)返回true)以上是C#学习教程:测试字符串中重复字符的内容,分享所有内容,如果对大家有用和C#学习教程你需要了解更多,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
