一 实现strStr()
逻辑上没问题了,在代码上还有点问题,待改进。
class Solution {
public:
//KMP
void getNext(int *next, string pattern){
//next数组 next[j]的值表示,当j所指向的值没对上,j下一次从 next[j]开始比
//当模式串下标0没对应上 应该返回0
next[0] = 0;
for(int i = 1; i < pattern.size(); i++){
int k = next[i-1];
//不断递归判断是否存在子对称
while(pattern[i] != pattern[k]&&k != 0 )
k = next[k-1];
if(pattern[i] == pattern[k])
next[i] = k + 1;
else
next[i] = 0;
}
return;
}
//strStr()
int strStr(string haystack, string needle) {
if(needle.size() == 0)
return 0;
//初始化 next数组
vector<int> next(needle.size());
getNext(&next[0], needle);
//模拟匹配,
int j = 0;
int i = 0;
while(i < haystack.size()){
//j >0 且没对上
while(j > 0 && haystack[i] != needle[j]){
j = next[j];
}
//j = 0 且没对上
if(j == 0 && haystack[i] != needle[j] ){
i++;
}
//对上了
if(haystack[i] == needle[j]){
j++;
i++;
}
//全部对上 返回
if(j == needle.size()){
return (i - needle.size());
}
}
return -1;
}
};
二、字符串总结
- C语言中,把一个字符串存入一个数组时,需要把结束符 ‘\0’存入数组,以此作为该字符串是否结束的标志。C++中,提供一个string类,string类会提供 size接口,可以用来判断string类字符串是否结束,就不用’\0’来判断是否结束。
- vector< char > 和 string在基本操作上没有区别,但是 string提供更多的字符串处理的相关接口,例如string 重载了+,而vector却没有。因此一般还是定义string。
三 双指针总结
- 数组的覆盖问题、滑动窗口、将两重for循环变为双指针一重循环等等都是双指针的典型应用。