在这部分:
int n,m;
for (int i=0;i<= n-m;i++) {
您正在使用未初始化的局部变量,这会导致未定义的行为。也尝试用比字母更有意义的东西来命名你的变量,我认为你的真正意思是:
int bruteForce(std::string needle, std::string haystack) {
int needleLen = needle.length(),
haystackLen = haystack.length();
for (int i = 0; i <= needleLen - haystackLen; i++) {
int j = 0;
while (j < haystackLen && needle[i+j] == haystack[j]) {
if(j == haystackLen) {
return i;
}
return 0;
}
}
// return 0; <--
}
另请注意,如果没有一个等于(对于每个),则在您的函数中没有return
任何值。当is "ab" 和is "aab" ~> 与 比较时,你的函数会(它应该放在循环之后)needle[i+j]
haystack[j]
i
needle
haystack
needle[1]
haystack[1]
return 0
for
另一个合理的更改是将按值传递更改为按引用传递以避免创建副本。而且由于您的函数不会更改这些字符串,因此它的原型应该是:
int bruteForce(const std::string& needle, const std::string& haystack)
如果您不想故意创建自己的实现,std::string::find
但由于某种原因您仍然需要它return 0
在失败时(您是否考虑过在needle
等于时使用您的函数haystack
?)它可能看起来像这样:
std::size_t bruteForce(const std::string& needle, const std::string& haystack) {
std::size_t pos = haystack.find(needle);
if (pos != std::string::npos)
return pos;
return 0;
}
...但如果是这样的话,你不会打电话的bruteForce
,对吧?:)