是否有标准函数在字符串中搜索相同的子字符串?

本文关键字:字符串 搜索 标准 函数 是否 | 更新日期: 2023-09-27 18:05:39

如果我有一个string,例如"ABEFAB",它将接受一个长度参数(eg. 2),然后返回一个结果,该结果将显示在我的string中有该长度的ARE identical substrings

是否有标准函数在字符串中搜索相同的子字符串?

我想你在找这个

public static bool HasIdenticalSubStrings(string str, int len)
{
    bool returnValue = false;
    List<String> lst = new List<string>();
    for (int i = 0; i <= str.Length - len; i++)
        lst.Add(str.Substring(i, len));
    returnValue = (lst.Distinct().Count() != lst.Count);
    return returnValue;
}

和call like

HasIdenticalSubStrings("ABEFAB", 2); //return true
HasIdenticalSubStrings("ABCDEF", 2); //return false

注意:您需要添加一些检查,如String.IsNullOrEmpty检查

有效方法:

public static bool HasIdenticalSubStrings(string str, int len)
{
    bool returnValue = false;
    List<String> lst = new List<string>();
    for (int i = 0; i <= str.Length - len; i++)
    {
        String tempstr = str.Substring(i, len);
        if (lst.Contains(tempstr))
        {
            returnValue = true;
            break;
        }
        else
            lst.Add(tempstr);
    }
    return returnValue;
}

最简单的(但不是最有效的)解决方案是

public static Boolean HasIdenticalSubStrings(String value, int length) 
{
  if (length <= 0)
    return false;
  else if (String.IsNullOrEmpty(value))
    return false;
  else if (value.Length <= length)
    return false;
  // HashSet is more efficient than List for Contains() operation
  HashSet<String> subStrings = new HashSet<String>();
  for (int i = 0; i <= value.Length - length; ++i) {
    String s = value.Substring(i, length);
    if (subStrings.Contains(s))
      return true;
    else
      subStrings.Add(s);
  }
  return false;
}
测试用例:

  HasIdenticalSubStrings("AAA", 2);    // true, overlaping "AA" substrings
  HasIdenticalSubStrings("ABxyAB", 2); // true
  HasIdenticalSubStrings("ABxAB", 2);  // true
  HasIdenticalSubStrings("ABCDEF", 2); // false

我认为Contains挺过了这一关。虽然它不需要任何长度参数,但我发现对于我的程序来说,它甚至是不必要的,因为我使用了一个确定的块大小。