使用字符进行字符串比较

4
我想在 c# 中将一个字符串与另一个字符串进行比较,在这个例子中。
 string Text1 = "123bob456";
 string Text2 =  "bobishere";

我想表达的是,如果有三个或更多字符在序列中匹配,则返回 true,这种情况下它们都包含“bob”,所以返回 true。
但我不知道如何实现,请帮忙,如果这是一个重复的问题,对不起,我不知道怎么表达。

必须匹配任意三个字符,还是必须匹配一个三个字符的序列? - Mike Precup
忘记补充了,我的意思是序列。 - user2279389
2个回答

6
你遇到的问题是最长公共子串问题, 可以通过算法解决,时间复杂度与两个字符串的长度和成正比。请参考链接了解可能的算法。
如果你愿意牺牲一些性能,也可以通过在第一个字符串中考虑每个序列的三个字符并在第二个字符串中搜索该序列来更简单地解决问题。以下是一个示例(我不太熟悉C#,请原谅任何语法错误):
for (int i = 0; i < s1.Length - 2; i++)
    if (s2.Contains(s1.Substring(i, 3)))
        return true;
return false;

你的选择将取决于你具体的问题。我会尝试第二种方法,如果速度太慢就进行修改。


那么你有什么建议?至于后面那个,我计划使用400个字符串进行操作,所以我希望它能够快速完成。 - user2279389
s1.Length - 3更改为s1.Length - 2,以捕获匹配子字符串位于s1末尾的情况。 - Matthew Strawbridge
1
您可以使用s2.Contains(s1.Substring(i,3))来提高可读性。 - Scott Chamberlain
当你说400个字符串时,你会如何比较它们?要从这400个字符串中找出每一个匹配吗?还是用于分组或聚类? - David Cummins
将图标名称分组到文件夹名称中 - user2279389

1
这个扩展程序可以运行:
public static bool ContainsSubstring(this string string1, string string2, int minLength, StringComparison comparison)
{
    if (minLength <= 0) throw new ArgumentException("Minimum-length of substring must be greater than 0", "minLength");
    if (string.IsNullOrEmpty(string1) || string1.Length < minLength) return false;
    if (string.IsNullOrEmpty(string2) || string2.Length < minLength) return false;

    for (int i = 0; i < string1.Length - minLength + 1; i++)
    {
        string part1 = string1.Substring(i, minLength);
        if (string2.IndexOf(part1, comparison) > -1)
            return true;
    }
    return false;
}

for example:

string Text1 = "123bob456";
string Text2 =  "bobishere";
bool contains = Text1.ContainsSubstring(Text2, 3, StringComparison.CurrentCultureIgnoreCase);  // true

演示


1
这个也可以,我会保存到我的一个类中,谢谢。 - user2279389

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接