我试图找出一种在大字符串中查找重复短语的有效方法。该字符串将包含由空格分隔的数百或数千个单词。我已经包含了我目前正在使用的代码,但它在查找重复短语方面效率很低。
public static string FindDuplicateSubstringFast(string s, string keyword, bool allowOverlap = true)
{
int matchPos = 0, maxLength = 0;
if (s.ToLower().Contains(keyword.ToLower()))
for (int shift = 1; shift < s.Length; shift++)
{
int matchCount = 0;
for (int i = 0; i < s.Length - shift; i++)
{
if (s[i] == s[i + shift])
{
matchCount++;
if (matchCount > maxLength)
{
maxLength = matchCount;
matchPos = i - matchCount + 1;
}
if (!allowOverlap && (matchCount == shift))
{
// we have found the largest allowable match
// for this shift.
break;
}
}
else matchCount = 0;
}
}
string newbs = s.Substring(matchPos, maxLength);
if (maxLength > 3) return s.Substring(matchPos, maxLength);
else return null;
}
我在@ Find duplicate content in string?
上面找到了示例代码这个方法遍历每个char,我想找到一种循环遍历每个单词的方法。我不确定最好的方法是什么。我以为我可以在空白区域拆分字符串然后将单词放入列表中。迭代列表应该比迭代我现在正在做的每个char更有效。但是,我不知道如何遍历列表并找到重复的短语。
如果有人能帮我弄清楚迭代列表找到重复短语的算法,我将非常感激。我也愿意接受任何其他想法或方法来查找大字符串中的重复短语。
如果需要更多信息,请告诉我。
修改 这是一个大字符串的例子{这个例子很小}
Lorem Ipsum只是打印和排版的虚拟文本 行业。 Lorem Ipsum一直是业界标准的虚拟文本 自16世纪以来。
例如,“Lorem Ipsum”将是重复的短语。我需要多次返回“Lorem Ipsum”和字符串中出现的任何其他重复短语。
答案 0 :(得分:4)
string[] split = BigString.Split(' ').ToLower();
var duplicates = new Dictionary<string, int>();
for (int i = 0;i<split.Length;i++)
{
int j=i;
string s = split[i] + " ";
while(i+j<split.Length)
{
j++;
s += split[j] + " ";
if (Regex.Matches(BigString.ToLower(), s).Count ==1) break;
duplicates[s] = Regex.Matches(BigString.ToLower(), s).Count;
}
}
现在,字典将包含所有短语和“subphrases”,例如“Lorem Ipsum Dolor”将找到“Lorem Ipsum”和“Lorem Ipsum Dolor”。如果这对您不感兴趣,那么只需循环Keys
duplicates
的集合即可。如果一个键是另一个键的子串,并且它们的值相同,则删除所述键。