2013-05-04 99 views
4

我想一个字符串在C#中的数据进行比较的字符串,在这个例子中字符串比较用字符

string Text1 = "123bob456"; 
string Text2 = "bobishere"; 

我想说,如果多于3(或更多)字符的序列匹配,则返回true,在这种情况下,它们都是真的,因为它们都包含“bob”。
但我不知道如何做到这一点,如果这是一个重复的问题,我可以帮助和抱歉,我知道如何说出来。

+0

难道必须匹配所有三个字符,或者是它的三个字符序列? – 2013-05-04 20:57:17

+0

忘了补充,我的意思是顺序 – user2279389 2013-05-04 20:57:42

回答

6

您的问题是longest common substring problem,它可以在时间上与两个字符串的长度之和成比例地求解。查看可能算法的链接。

如果您愿意采取一点性能打击,您可以更简单地考虑第一个字符串中的每个3个字符序列,然后在第二个字符串中搜索该序列。下面是一个例子(我不是很熟悉C#,所以请原谅任何语法错误):

for (int i = 0; i < s1.Length - 2; i++) 
    if (s2.Contains(s1.Substring(i, 3))) 
     return true; 
return false; 

你的选择将取决于您的特定问题。如果速度太慢,我会尝试第二种方法并修改。

+0

所以你会推荐什么?,而对于后面的一个,我打算用400个字符串做这个,所以我宁愿它快一点。 – user2279389 2013-05-04 21:04:17

+0

从's1.Length - 3'到's1.Length - 2'来捕捉匹配子字符串在's1'结尾的情况。 – 2013-05-04 21:09:25

+1

你可以使用's2.Contains(s1.Substring(i,3))'来方便阅读。 – 2013-05-04 21:09:35

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

例如:

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

Demo

+1

这也适用,我将其保存到我的课程之一谢谢 – user2279389 2013-05-04 22:08:46