Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算子串的算法_C#_Algorithm_Search - Fatal编程技术网

C# 计算子串的算法

C# 计算子串的算法,c#,algorithm,search,C#,Algorithm,Search,我正在努力学习制作高效的算法。 我查找子字符串的代码如下 public static bool HasSubstring(string MainStr,string SubStr) { bool FoundMatch = false; for (int i = 0; i < MainStr.Length; i++) { if (SubStr.Length != 0) {

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

 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;


    }
publicstaticboolhassubstring(stringmainstr,stringsubstr)
{
bool-FoundMatch=false;
对于(int i=0;i}然而(a我可以看到一些事情可以改善这一点

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

    if (FoundMatch)
      return true;
    

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

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

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

如果您想查找子字符串的所有匹配项,以下是一些众所周知的字符串模式匹配算法。

。编辑:如果这不是关于查找子字符串,而是关于学习算法,那么您可以在找到匹配项后立即返回,这似乎更适合。我认为这个问题属于n很抱歉,我没有理解@sayselso,你的C#变量通常应该是
小写的melcase
,而不是大写的。别忘了Boyer Moore