计算子字符串的算法
本文关键字:算法 字符串 计算 | 更新日期: 2023-09-27 18:17:31
我正在努力学习制作高效的算法。我查找子字符串的代码如下
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;
}
我可以优化这个方法吗?
我可以看到一些事情来改进这个
- 在循环之前,检查子字符串的长度是否为0,如果是,返回false(不检查每次迭代)
- Remove ALL
== true
这基本上是在比较布尔值和布尔值 - 使用IndexOf查找子字符串的第一个字符(如果IndexOf的结果是-1则返回false),然后使用此索引作为i的起始值
-
我相信除了
j
变量你可以增加i
但是我还没有测试过这个if (FoundMatch) return true;
我想你可以看看下面的算法:
- Knuth Morris Pratt
- - karp
如果你想找到一个字符串中所有出现的子字符串,下面是一些众所周知的模式匹配算法。
使用While代替Do While。这两个循环的不同之处在于Do循环中的代码将至少执行一次,因为while部分在末尾。while部分位于开头,圆括号中的结束条件可能已经为真(i可能大于loopEnd)。我觉得你没必要继续了。