替换空格
双指针翻转字符串
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数组里记录的起始位置为-1for(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());
