151.翻转字符串里的单词
有点类似昨日的最后一题,都涉及到一些逻辑处理。这题跳过空格,也可以用指针和substr提取字符串做处理。我这里使用istringstream提取字符串,再创建额外的空间写出翻转后的结果(感觉这样会简单很多。
。
class Solution {
public:
string reverseWords(string s) {
vector<string> vec;
std::istringstream iss(s);
std::string word;
while (iss >> word) {
vec.push_back(word);
}
string res;
for(int i = vec.size() - 1; i > 0;--i) {
res+=vec[i] + " ";
}
res+=vec[0];
return res;
}
};
不创建另外的空间,这里采用反转字符串再反转字符,配合空格的逻辑处理也能解决。
class Solution {
public:
string reverseWords(string s) {
//去除开头和结尾的空格
auto start = s.find_first_not_of(" ");
auto end = s.find_last_not_of(" ");
s = s.substr(start, end - start + 1); // 截取去掉开头和结尾空格的子字符串
//翻转整符串
std::reverse(s.begin(), s.end());
//翻转单词
int wordStart = 0;
for (int wordEnd = 0; wordEnd < s.size(); ++wordEnd) {
if (s[wordEnd] == ' ') {
std::reverse(s.begin() + wordStart, s.begin() + wordEnd); // 翻转单词
wordStart = wordEnd + 1;
}
}
// 翻转最后一个单词
std::reverse(s.begin() + wordStart, s.end());
//去除重复的空格
auto it = std::unique(s.begin(), s.end(), [](char a, char b) {
return a == ' ' && b == ' ';
});
s.erase(it, s.end());
return s;
}
};
卡码网:55.右旋转字符串
思路简单,找到pos位置后,很容易想到分成两个字符串再拼接;也可以从原地后往前插入字符。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
int num;
string str;
cin >> num >> str;
int n = str.size();
int pos = n - num;
auto str2 = str.substr(pos);
auto str1 = str.substr(0,pos);
cout << str2 + str1 << endl;
return 0;
}
28. 实现 strStr()
要用到KMP算法,先插个眼 KMP 算法讲解,下次再补齐代码。
459.重复的子字符串
同上。