DAY9 - 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459. 重复的子字符串
151.翻转字符串里的单词
把复杂问题拆分成简单问题的能力比较薄弱。比如这个问题中:
删除空格 =》删除字符串中的元素并且添加
调转单词=》先把整串字符串倒转,再分别倒转正每个单词
class Solution {
public:
string reverseWords(string s) {
// 移除空格 跟移除元素操作一样
int slow=0;
for(int fast=0;fast<s.size();fast++){
if(s[fast]!=' '){
if(slow!=0) s[slow++]=' '; //增加空格
while(fast<s.size()&&s[fast]!=' '){ //单词直接copy
s[slow++]=s[fast++];
}
}
}
s.resize(slow);
//反转整个字符串
for(int i=0,j=s.size()-1;i<j;i++,j--){
swap(s[i],s[j]);
}
//把单词转正
int i=0,j=0;
while(i<s.size()&&j<s.size()){
while(j<s.size()&&s[j]!=' ') {j++;}
for(int m=i,n=j-1;m<n;m++,n--){
swap(s[m],s[n]);
}
i=j+1;
j=i;
}
return s;
}
};
删除空格这里有点没有看懂,晕晕的。
卡码网:55.右旋转字符串
字符串转来转去就都是反转字符串的延申。
这个的思路就是先整个字符串反转,再分别反转前后两个子串。
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
int k;
cin >> k;
cin >> s;
for(int i=0,j=s.size()-1;i<j;i++,j--){
swap(s[i],s[j]);
}
for(int i=0,j=k-1;i<j;i++,j--){
swap(s[i],s[j]);
}
for(int i=k,j=s.size()-1;i<j;i++,j--){
swap(s[i],s[j]);
}
cout << s;
}
浙公网安备 33010602011771号