字符串模板代码
这类题目我的惯常做法,也是核心思想,就是先把句子中所有字符串取出放入字符串数组,再对数组中的字符串进行操作后重新连接即可,具体问题具体细节还需要按题目要求分析
而遍历句子取字符串的思路,就是遇到字符把它放入临时字符串,遇到空格或者标点(如果有标点),就把临时字符串输出,并且清空
需要注意的是
这类题目可以分为两类,一类是有前置或者后置空格的,另一类是没有前置和后置空格的。
1、如果有前后置空格,那么必须判断临时字符串非空才能输出,否则会输出空串
s += " "; //这里在最后一个字符位置加上空格,这样最后一个字符串就不会遗漏 因为遇到空格才会输出`temp`
string temp = ""; //临时字符串
vector<string> res; //存放字符串的数组
for (char ch : s) //遍历字符句子
{
if (ch == ' ') //遇到空格
{
if (!temp.empty()) //临时字符串非空,保证多余的空格不会存入到res中
{
res.push_back(temp);
temp.clear(); //清空临时字符串
}
}
else
temp += ch;
}
2、没有前后置的空格不需要判断空串。 遇到空格就说明temp
中存好了一个单词
s += " ";
string temp = "";
vector<string> res;
for (char ch : s)
{
if (ch == ' ')
{
res.push_back(temp);
temp.clear();
}
else
temp += ch;
}
作者:eh-xing-qing
链接:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof/solution/yi-ge-mo-ban-shua-bian-suo-you-zi-fu-chu-x6vh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题解
此题明显,输入字符串有多余的空格,因为使用模板1。(其实模板1就已经可以统一模板2了?)
class Solution {
public:
string reverseWords(string s) {
s += " "; // 末尾加空格
string temp="";
vector<string> res;
for(auto c:s){
if(c==' '){
if(!temp.empty()){
res.push_back(temp); // 存入一个单词
temp.clear();
}
}
else{ // 注意这个else是与外面的if配对的
temp += c; // 拼接单词
}
}
// 将res中的单词反向“吐”出
s.clear(); // 情况s s=""也行,但要习惯用clear()
reverse(res.begin(), res.end());
for(auto word:res){
s += (word+' '); // 单词之间空格隔开
}
s.pop_back(); // 清除最后一个字符(空格)
return s;
}
};