题目要求
版本一:泛型算法search
整体思路
直接使用search函数,将haystack字符串和needl字符串传入,得到返回值
根据返回值判断最终的结果
代码
class Solution {
public:
int strStr(string haystack, string needle) {
if (needle.empty())
{
return 0;
}
auto i = std::search(haystack.begin(), haystack.end(), needle.begin(), needle.end());
if (i == haystack.end())
{
return -1;
}
else
{
return static_cast<int>(i - haystack.begin());
}
}
};
版本二:暴力匹配(复习知识)
整体思路
想到了数据结构学到的字符串匹配问题
设置两个指针,一个主指针,指向主字符串。一个子指针,指向子字符串。初始化为0.
一步一步的移动主指针,当出现主指针和子指针指向的字符相同时,循环地同时递增两个指针,直到两个指针所指字符不相等或者子指针指到末尾。
如果子指针能够指到子字符串的末尾,则匹配成功。返回主指针减去子指针的index值
如果子
如果子指针没能指到子字符串的末尾,则本轮匹配失败。将主指针退回发生匹配时位置的下一位,子指针退回0,继续移动主指针。
当主指针移动到主字符串末尾时,说明主字符串中不包含子字符串,匹配失败。返回-1
代码
class Solution {
public:
int strStr(string haystack, string needle)
{
if (needle.empty())
{
return 0;
}
unsigned i = 0, j = 0;
while (i < haystack.size())
{
while (j < needle.size() && haystack[i] == needle[j])
{
++i;
++j;
}
if (j == needle.size())
{
return i - j;
}
else
{
i = i - j; //注意将i复原
j = 0; //这两句顺序不要颠倒
}
++i;
}
return -1;
}
};