C++ 实现strStr()
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
示例1
输入:haystack = "hello", needle = "ll"
输出:2
示例2
输入:haystack = "aaaaa", needle = "bba"
输出:-1
提示:
1 <= haystack.length, needle.length <= 104
haystack
和needle
仅由小写英文字符组成
思路/解法
方式一
暴力穷举遍历,一一比对即可。
class Solution
{
public:
int strStr(string haystack, string needle)
{
int index = -1;
int size = haystack.length();
bool isEqual = true;
int curIndex = 0;
for(int i = 0;i < size;i++)
{
if(haystack[i] == needle[0])
{
if(size - i < needle.length())
{
break;
}
curIndex = i;
for(int j = 0;j < needle.length();j++)
{
if(haystack[curIndex++] != needle[j])
{
isEqual = false;
break;
}
}
if(isEqual)
{
index = i;
break;
}
isEqual = true;
}
}
return index;
}
};
方式二
KMP字符串匹配算法,参考链接:https://blog.csdn.net/qq135595696/article/details/123439626
class Solution
{
public:
void PrefixTable(string pattern, vector<int>& prefix)
{
prefix[0] = 0;
int len = 0;
int i = 1;
while(i < pattern.length())
{
if(pattern[i] == pattern[len])
{
len++;
prefix[i] = len;
i++;
}
else
{
if(len > 0)
{
len = prefix[len - 1];
}
else
{
prefix[i] = 0;
i++;
}
}
}
}
void MovePrefixTable(vector<int>& prefix)
{
int i;
for(i = prefix.size() - 1; i > 0;i --)
{
prefix[i] = prefix[i - 1];
}
prefix[i] = -1;
}
int KMPSearch(string haystack, string needle)
{
int i = 0;
int j = 0;
vector<int> prefix(needle.length(), 0);
PrefixTable(needle, prefix);
MovePrefixTable(prefix);
while(i < haystack.length())
{
if(j == needle.length() - 1 && haystack[i] == needle[j])
{
return i - j;
}
if(haystack[i] == needle[j])
{
i++;
j++;
}
else
{
j = prefix[j];
if(-1 == j)
{
j++;
i++;
}
}
}
return -1;
}
int strStr(string haystack, string needle)
{
return KMPSearch(haystack, needle);
}
};