【问题标题】:String Comparisons with chars字符串与字符的比较
【发布时间】:2013-05-04 20:55:41
【问题描述】:

我想在 C# 中比较一个字符串和另一个字符串,在这个例子中

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

我想说,如果超过 3 个(或更多)字符按顺序匹配,则返回 true,在这种情况下,它会为 true,因为它们都包含“bob”。
但我不知道该怎么做,如果这是一个重复的问题,我不知道如何措辞,请您帮忙并抱歉。

【问题讨论】:

  • 是任意三个字符必须匹配,还是三个字符的序列?
  • 忘了添加,我是说序列

标签: c# string char


【解决方案1】:

您的问题是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;

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

【讨论】:

  • 那么你会推荐什么?至于后一个,我打算用 400 个字符串来做这个,所以我希望它快
  • s1.Length - 3 更改为 s1.Length - 2 以捕获匹配子字符串位于 s1 末尾的情况。
  • 您可以使用s2.Contains(s1.Substring(i,3)) 以提高可读性。
  • 当您说 400 个字符串时,您将如何比较它们?从 400 个字符串中找到每对之间的匹配项?将其用于分组或聚类?
  • 用于将图标名称分组到文件夹名称
【解决方案2】:

此扩展有效:

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

【讨论】:

  • 这也有效,我将把它保存到我的班级之一,谢谢
猜你喜欢
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2023-03-15
  • 2012-05-16
  • 2011-08-17
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多