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