题1:
指路:LeetCode28 找出字符串中第一个匹配项的下标
思路与代码:
1.指针暴力
第一反应这样做,代码如下:
class Solution {
public:
int strStr(string haystack, string needle) {
//思路:两个指针分别指向数组1和数组2的开头,一样的话就数组2的左指针右移一个,不一样的话数组1的左指针右移一个
//到数组1的指针达到右边界(此时返回-1)或数组2的左指针到最右(此时返回数组1的左指针)为止
int right1 = haystack.size(); // 数组1的左右边界
int right2 = needle.size(); // 数组2的左右边界
for (int left1 = 0; left1 + right2 <= right1; left1++) {
bool flag = true;
for (int left2 = 0; left2 < right2; left2++) {
if (haystack[left1 + left2] != needle[left2]) {
flag = false;
break;
}
}
if (flag)
return left1;
}
return -1;
}
};
2.KMP算法
好难,一刷没搞明白,先看看代码吧。
class Solution {
public:
void getNext(int* next, const string& s) {
int j = 0;
next[0] = 0;
for (int i = 1; i < s.size(); i++) {
while (j > 0 && s[i] != s[j]) {
j = next[j -1];
}
if (s[i] == s[j]) {
j++;
}
next[i] = j;
}
}
int strStr(string haystack, string needle) {
if (needle.size() == 0) {
return 0;
}
int next[needle.size()];
getNext(next, needle);
int j = 0;
for (int i = 0; i < haystack.size(); i++) {
while (j > 0 && haystack[i] != needle[j]) {
j = next[j - 1];
}
if (haystack[i] == needle[j]) {
j++;
}
if (j == needle.size()) {
return (i - needle.size() + 1);
}
}
return -1;
}
};
寥寥草草的解题,因为真的有点难。