c# - 快速字符串检查查找字符串内的重复项

标签 c# php javascript regex

A string = "aabbccaaabbcbbdbabdaaa";
如何以有效的方式检查该字符串以查找内部字符串重复项:
我的意思是:

  1. 字符串中查找2个字母的字符串:

    aa = "aa bbcc aa abbcbbdbabd 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
    ...

  2. 字符串中查找3个字母的字符串:

    aaa = "aaa bbcc aaa bbcbbdbabd aaa ";
    总计 aaa = 3;
    aaa 之间的距离 = 4,10;
    ...


我的尝试是 4 个周期,而且非常慢。

附注
任何帮助表示赞赏。对不起我的英语不好。

编辑:
抱歉问了一个不好的问题。我忘了说 string 还应该检查 4 个字符重复项和其他字符重复项:
aabb = "aabb cca aabb cbbdbabdaaa";
总计aabb = 2;
aabb 之间的距离 = 3;


编辑2:
我们要查找的重复项不应手动输入。想象一下字符串有20k个符号,并且您正在搜索任何重复项(没有空格)以及这些重复项之间的距离。
感谢并再次抱歉,问题不正确。

最佳答案

这是 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;
}

我根据你的评论写了这个......

list of all [2, 3, ..., n/2] characters duplicates, where n = string length

我认为这工作得很好。它返回一个包含字符串和每个重复项的索引的字典。就性能而言,多次调用 IndexOf() 可能是其中最慢的部分,但我不知道有什么办法可以解决这个问题。

更新 我更改了代码以包含重叠的要求。

更新#2 我添加了几个条件,算法将打破内部for循环。这大大提高了性能(特别是当发现的重复项很少时)。

关于c# - 快速字符串检查查找字符串内的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9549444/

相关文章:

c# - Form.ShowDialog() 不显示启用调试的窗口

javascript - 如何解析数据并将其传递到我的 Morris.js 图表

php - 使用 mysql 使用时区 php 查找打开和关闭状态

php - 如何使用ajax在不刷新的情况下删除一行并显示更新的数据库

javascript - 如何在页面加载时自动运行功能?

c# - ASP.Net 平台是独立的吗?

c# - MEF 容器无法从共享装配中组成零件

c# - 列出给定类的 [XmlAttribute] 的所有属性

javascript - 为什么这个异步函数同步运行?

javascript - 使异步代码像同步一样工作 - Javascript