【问题标题】:Algorithm to calculate the substring [closed]计算子串的算法[关闭]
【发布时间】:2013-06-07 07:17:45
【问题描述】:

我正在努力学习制作高效的算法。 我查找子字符串的代码如下

 public static bool HasSubstring(string MainStr,string SubStr)
    {
        bool FoundMatch = false;

        for (int i = 0; i < MainStr.Length; i++)
        {

            if (SubStr.Length != 0)
            {
                int a = 0;
                int j = 0;
                if (MainStr[i] == SubStr[a])
                {
                    j = i;
                    do
                    {
                        if (MainStr[j] == SubStr[a])
                        {
                            a++;
                            j++;
                            FoundMatch = true;
                            continue;

                        }
                        else
                        {
                            FoundMatch = false;
                            break;
                        }


                    } while (a<SubStr.Length);
                    if (FoundMatch == true)
                    {
                        break;
                    }


                }
            }
        }

        return FoundMatch;


    }

我可以优化这种方法吗?

【问题讨论】:

  • string contains?。编辑:如果这不是关于查找子字符串和关于学习算法的不正确,那么您可以在找到匹配项后立即返回
  • 这似乎更适合Code Review
  • 我认为这个问题属于codereview.stackexchange.com
  • 很抱歉我没有找到你@Sayse
  • 另外,你的 C# 变量通常应该是lowercaseCamelCase,而不是大写。

标签: c# algorithm search


【解决方案1】:

我可以看到一些事情来改进这一点

  • 在循环之前,检查子字符串是否为0长度,如果是则返回false(不要检查每次迭代)
  • 删除 ALL == true 基本上是比较布尔值和布尔值
  • 使用IndexOf 查找子字符串的第一个字符(如果 indexOf 的结果为 -1,则返回 false),然后将此索引用作 i 的起始值
  • 我相信你可以增加 i 而不是 j 变量,但我没有测试过这个

    if (FoundMatch)
      return true;
    

【讨论】:

    【解决方案2】:

    我想你可以看看以下算法:

    • 克努斯·莫里斯·普拉特
    • 拉宾-卡普

    如果您想查找所有出现的子字符串,这些是用于字符串中模式匹配的一些众所周知的算法。

    【讨论】:

    • 别忘了博耶-摩尔
    【解决方案3】:

    使用 Wile 而不是 Do While。两个循环之间的区别在于,Do 循环中的代码将至少执行一次,因为 while 部分位于末尾。在开头的 while 部分,圆括号中的结束条件可能已经为真(我可能不仅仅是 loopEnd)。 我认为你不需要继续。

    【讨论】:

      猜你喜欢
      • 2013-01-22
      • 2014-03-23
      • 1970-01-01
      • 2011-04-16
      • 2015-02-10
      • 1970-01-01
      • 2013-10-05
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多