28. 实现 strStr()
题目链接/文章讲解/视频讲解:代码随想录
代码
class Solution {
public:
int strStr(string haystack, string needle) {
return KMP(haystack, needle);
}
int KMP(const string &mainStr, const string &subStr){
int* prefix = getPrefix(subStr);
char mainTemp = 0;
char subTemp = 0;
int ans = 0;
while(mainTemp < mainStr.size()){
if(mainStr[mainTemp] == subStr[subTemp]){
mainTemp++;
subTemp++;
}
else if(subTemp > 0){
subTemp = prefix[subTemp - 1];
}
else{
mainTemp++;
}
if(subTemp == subStr.size()){
return mainTemp - subTemp;
}
}
return -1;
}
int* getPrefix(const string &subStr){
int size = subStr.size();
int* prefix = new int[size];
int length = 0;
prefix[0] = 0;
for(int i = 1; i < size;){
if(subStr[length] == subStr[i])
{
prefix[i++] = ++length;
}
else{
if(length != 0){
length = prefix[length - 1];
}
else{
prefix[i++] = 0;
}
}
}
for(int i = 0; i < size; i++){
cout << prefix[i];
}
return prefix;
}
};
459.重复的子字符串 (本题可以跳过)
题目链接/文章讲解/视频讲解:代码随想录
代码
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int size = s.size();
if(size < 2) return false;
vector<int> prefix(size);
getPrefix(&prefix[0], s);
int lastValue = prefix[size-1] + 1;
if(lastValue != 0 && size % (size - lastValue) == 0){
return true;
}
else{
return false;
}
}
void getPrefix(int* prefix, const string &s){
int i = 1;
int j = -1;
prefix[0] = -1;
while(i < s.size()){
while(j >= 0 && s[i] != s[j + 1]){
j = prefix[j];
}
if(s[i] == s[j + 1]){
j++;
}
prefix[i] = j;
i++;
}
}
};