C# 快速字符串检查查找字符串中的重复项
字符串=aabbccaabbcbbdbabdaaa; 如何有效地检出该字符串以查找内部字符串副本: 我的意思是: 正在字符串中查找两个字母的字符串: aa=aa bbcc aa abbcbdbabd aa a//此处或字符串中的其他位置没有空格。只是添加了它们来强调aa。 aa=aa bbcca aa bbcbbdbabda aa; 总aa=5; aa之间的距离=4,5,11,12; bb=aa bb ccaaa bb c bb dbabdaaa; 总bb=3; bb=5,1之间的距离 ... 正在字符串中查找3个字母的字符串: aaa=aaa bbcc aaa bbcbbdbabd aaa; 总aaa=3; aaa之间的距离=4,10; 我的尝试是在4个周期的方式和非常缓慢 附言。 感谢您的帮助。对不起我的英语。 编辑: 对不起,问得不好。我忘了说字符串还应该检查4个字符的重复项和其他字符的重复项: aabb=aabb-cca-aabb-cbbdbabdaaa; 总aabb=2; aabb之间的距离=3; 编辑2: 我们正在寻找的副本不应手动输入。假设字符串是20k个符号,并且您正在搜索任何重复项—没有空格以及这些重复项之间的距离。C# 快速字符串检查查找字符串中的重复项,c#,php,javascript,regex,C#,Php,Javascript,Regex,字符串=aabbccaabbcbbdbabdaaa; 如何有效地检出该字符串以查找内部字符串副本: 我的意思是: 正在字符串中查找两个字母的字符串: aa=aa bbcc aa abbcbdbabd aa a//此处或字符串中的其他位置没有空格。只是添加了它们来强调aa。 aa=aa bbcca aa bbcbbdbabda aa; 总aa=5; aa之间的距离=4,5,11,12; bb=aa bb ccaaa bb c bb dbabdaaa; 总bb=3; bb=5,1之间的距离 ...
再次感谢并抱歉问题不正确。有许多字符串搜索算法 维基百科页面对它们进行了很好的总结: JavaScript
onclick = "f('a',3)" //return 2
onclick = "f('a',2)" //return 5
.......
var f = function(ch, nb){ //ch - searching character. nb - number of repetitions
var str = "aabbccaaabbcbbdbabdaaa";
var strLen = str.length;
var res = 0;
for(var i = 0; i < strLen; ++i){
if(str[i] == ch){
for(var j = i; j < nb+i || j <strLen; ++j){
if(str[j] != ch){
break;
}
if(j+1 == nb+i){
res++;
}
}
}
}
return res;
};
在Javascript中使用普通字符串函数
var a = " aa bbcc aa abbcbbdbabd aa a";
var s = "aa", ix = [], i=0;
while(true){
i = a.indexOf(s, i);
if(i==-1)
break;
i += s.length
ix.push(i);
}
现在,ix包含找到s=aa的索引数组。ix.length是总调查结果的数量。下面的算法将发现两者之间的差异
var differences=[];
for(var j=1; j<ix.length; j++){
differences.push(ix[j]-ix[j-1]);
}
这是比正则表达式更快的替代方法。这里有一个C语言的解决方案
static Dictionary<string, List<int>> GetDuplicates2(string value)
{
var duplicates = new Dictionary<string, List<int>>();
for (int i = 0; i < value.Length; i++)
{
for (int slength = 2; slength < (value.Length - i) / 2 + 2; slength++)
{
var littleString = value.Substring(i, slength);
if (!duplicates.ContainsKey(littleString))
{
int nextOccurrence = value.IndexOf(littleString, i + slength - 1);
if (nextOccurrence != -1)
{
var l = new List<int>();
l.Add(i);
l.Add(nextOccurrence);
duplicates.Add(littleString, l);
while ((nextOccurrence = value.IndexOf(littleString, nextOccurrence + slength - 1)) != -1)
{
duplicates[littleString].Add(nextOccurrence);
}
}
else
{
break;
}
}
else
{
break;
}
}
}
return duplicates;
}
我是根据你的评论写的
所有[2,3,…,n/2]个重复字符的列表,其中n=字符串
长度
我认为这很有效。它返回一个包含字符串和每个副本的索引的字典。就性能而言,多次调用IndexOf可能是最慢的部分,但我不知道如何解决这个问题
更新
我修改了代码以包含重叠的要求
更新2
我添加了一些条件,在这些条件下,算法将突破内部for循环。这大大提高了性能,尤其是在几乎找不到重复项的情况下。这几乎就是所做的,它只需要通过字符串一次。哪种语言?您已经标记为,…如果您可以签出该列表中的任何一个。我更喜欢javascript,但这并不重要。@Josh,我知道代码是什么样子的。只是为了回答你的问题对不起,还没有读到链接,很多文字对不起,我的回答不清楚。搜索字符及其重复次数应手动输入,因为sting可以是20k符号,除aab外,还应检查aas。s应为:aa、ab、bb、bc、。。。aab、abb、bbc、bcc。。。aabb,abbc,bbcc。。。抱歉,如果你误解了我的问题。我已经编辑过了。@ted是的,我知道我会教你怎么做。我不是为你做的。你可以循环所有的aa,bb,cc等等,从我的代码中得到结果。如何循环通过so s=aa;然后:ab,bb,…aab,abb,…aabb,abbc,…aabbccaabb然后?非常感谢。上面的代码很棒:您的代码返回aa=3作为输入aabbccaabbcbbdbabdaaa。一定是5@L.B.啊,重叠的重复。直到你提到这个要求,我才注意到。我只是更新了代码来解决这个问题。我是唯一一个满足OP要求的人,即在不搜索任何特定内容的情况下查找所有副本。但我却被否决了。。。很好。向上投了你的票,谢谢:在选择“最”正确的答案之前,我会玩我的代码一段时间。@SteveWortham我取消了我的向下投,但除非你编辑你的答案,否则它不会被激活。观察得很好。重叠的重复需求可能是最大的区别。除此之外,它非常相似。顺便说一句,我从LZW实现开始构建解决方案,但最终我发现了太多的差异。最后,我想我开始重写上面的解决方案了。