151.翻转字符串里的单词
思路:
1、先去空格
2、反转整个字符串
3、反转每个单词
困难:
1、去空格时怎么去除前导后导的空格 字母前的空格才算?使用flag?
移除所有空格并手动添加一个空格? 添加空格后直接循环到下一个空格 然后看下一个非空格
2、在反转每个单词的时候怎么精准使用reverse?快慢指针?
3、debug错误
最后反转单词的时候,==使用了=而且忽略了最后一个单词
去空格的时候if (j != 0)把后面循环也包含进去了
代码:
class Solution {
public:
string reverseWords(string s) {
int j=0;
for(int i=0;i<s.size();i++) {
if(s[i]!=' ') {
if(j!=0) s[j++]=' ';
while(i<s.size()&&s[i]!=' ') {
s[j++]=s[i++];
}
}
}
s.resize(j);
reverse(s.begin(),s.end());
for(int i=0,slow=0;i<=s.size();i++) {
if(i==s.size()||s[i]==' ') {
reverse(s.begin()+slow,s.begin()+i);
slow=i+1;
}
}
return s;
}
};
右旋字符串
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
int main(){
int n;
string s;
cin>>n;
cin>>s;
int len = s.size();
reverse(s.begin(),s.end());
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
cout << s << endl;
return 0;
}
28. 实现 strStr()
暴力算法
1、i <= haystack.size() - needle.size(); 这里是小于等于
2、 if(haystack.size()<needle.size()) return -1; 开局先判断大小
代码:
class Solution {
public:
int strStr(string haystack, string needle) {
if(haystack.size()<needle.size()) return -1;
for(int i = 0; i <= haystack.size() - needle.size(); i++) { // 修改部分:条件从 i < haystack.size() - needle.size() 变为 i <= haystack.size() - needle.size()
int j = 0;
while(j < needle.size() && haystack[i + j] == needle[j]) { // 修改部分:将 || 改为 &&
j++;
}
if(j == needle.size()) return i;
}
return -1;
}
};
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;
if(needle.size()>haystack.size()) return -1;
vector<int> next(needle.size());
getNext(&next[0],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;
}
};
459.重复的子字符串
枚举法
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int n=s.size();
for(int i=1;i<=n/2;i++) {
if(n%i==0) {
bool match = true;
for(int j=i;j<n;j++){
if(s[j]!=s[j-i]) {
match=false;
break;
}
}
if(match) return i;
}
}
return false;
}
};