我正在尝试在字符串T
中找到字符串P
,并在T
中返回P
的位置。
这是我尝试过的,但它不正确:
int bruteForce(string T, string P) {
int n, m;
for (int i = 0; i <= n-m; i++) {
int j = 0;
while (j < m && T[i+j] == P[j]) {
if (j == m) {
return i;
}
return 0;
}
}
}
我做错了什么?我错过了什么?
答案 0 :(得分:2)
在这部分:
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
均不等于needle[i+j]
(每haystack[j]
个),则在您的函数中不会i
任何值。当needle
为“ab”而haystack
为“aab”时,情况怎么样?&gt;在将needle[1]
与haystack[1]
进行比较时,您的函数将return 0
(它应放在for
循环之后)
另一个合理的改变是将值传递更改为通过引用传递以避免创建副本。由于您的函数不会更改这些字符串,因此其原型应为:
int bruteForce(const std::string& needle, const std::string& haystack)
如果您不想故意创建自己的std::string::find
实现,但由于某种原因,您仍然需要return 0
失败时(您是否考虑过needle
时使用{ {1}}等于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
,是吗? :)
答案 1 :(得分:1)
我尽量不要过多地改变你的代码。我的变化是:
const reference
以避免浪费副本。n
和m
未初始化。while
循环出现问题。它没有增加j
,成功的测试在循环之外更有意义。0
,因为它可能是有效的位置。修改后的代码(经过简单测试,似乎有效):
int bruteforce(const std::string &T, const std::string &P)
{
int n = T.length();
int m = P.length();
for (int i = 0; i <= n-m; ++i) {
int j = 0;
while (j < m && T[i+j] == P[j]) {
++j;
}
if (j == m) { // match found
return i;
}
}
return -1;
}