Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 快速字符串检查查找字符串中的重复项_C#_Php_Javascript_Regex - Fatal编程技术网

C# 快速字符串检查查找字符串中的重复项

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之间的距离 ...

字符串=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个符号,并且您正在搜索任何重复项—没有空格以及这些重复项之间的距离。
再次感谢并抱歉问题不正确。

有许多字符串搜索算法

维基百科页面对它们进行了很好的总结:

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实现开始构建解决方案,但最终我发现了太多的差异。最后,我想我开始重写上面的解决方案了。