A string = "aabbccaaabbcbbdbabdaaa";
如何以有效的方式检查该字符串以查找内部字符串重复项:
我的意思是:
在
字符串
中查找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
...
在
字符串
中查找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/