替换空格
双指针翻转字符串
https://leetcode-cn.com/problems/reverse-words-in-a-string/
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(),s.end());
int index = -1;
for(int i=0;i<s.length();i++) {
// cout<<"-----"<<index<<' '<<i<<' '<<s<<endl;
while(i<s.length() && s[i]==' ') i++;
int l = i;
while(i<s.length() && s[i]!=' ') i++;
l = i-l;
if(l==0) continue;
index++;
reverse(s.begin()+index,s.begin()+i);
index += l;
// cout<<"+++++"<<index<<' '<<i<<' '<<s<<endl;
}
s.resize(index);
return s;
}
};
字符串匹配-KMP
算法思想:当字符串不匹配时,利用之前一部分已经匹配的内容,避免再从头匹配。
next数组:是一个前缀表,表示i(包括i)之前最长相等的前后缀长度,这个数值可能会是应该跳到的下标-1
其他内容可以参考我写的博客https://blog.csdn.net/qq_38140099/article/details/78661127
这里给出《算法导论》中的代码,更容易理解,时间复杂度相同的
class Solution {
public:
void getNext(int* next, const string& s) {
int k=-1;
next[0]=k;
for(int i=1;i<s.length();i++) {// 注意i从1开始
while(k>=0 && s[i]!=s[k+1]) k = next[k];
if(s[i]==s[k+1]) {
k++;
}
next[i] = k;
}
}
int strStr(string haystack, string needle) {
if(needle.length()==0) return 0;
int next[needle.length()];
getNext(next, needle);
int j=-1;// 因为next数组里记录的起始位置为-1
for(int i=0;i<haystack.length();i++) {
while(j>=0 && haystack[i]!=needle[j+1]) j=next[j];
if(haystack[i]==needle[j+1]) j++;
if(j+1 == needle.length()) return i-j;
}
return -1;
}
};
字符串转整数
int res = atoi(str.c_str());