题目描述
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
简单分析
分词,然后每个词一倒序,只需要一个字符串存储当前倒序的结果。接着看到了12.6MB的空间占用,在想优化占用空间来说应该把字符串存储这一步省略了,然后选择了不占用额外空间,直接在字符串基础上修改倒序。结果如下,emmm似乎并没有少太多
代码
class Solution {
public:
string reverseWords(string s) {
if(s.size()== 0)
return s;
string tmp;
for(int i=0;i<s.size();i++){
if(s[i]!=32){
tmp.push_back(s[i]);
}
else{
string t = tmp;
reverse(tmp.begin(),tmp.end());
s.replace(i-t.length(),t.length(),tmp);
tmp = "";
}
}
if(tmp!=""){
string t = tmp;
reverse(tmp.begin(),tmp.end());
s.replace(s.length()-t.length(),t.length(),tmp);
}
return s;
}
};
// 字符串本身修改
class Solution {
public:
string reverseWords(string s) {
if(s.size()== 0)
return s;
char t;
int count = 0;
for(int i=0;i<s.length();i++){
if(s[i]!=32){
count++;
}
else {
int cur = i;
int idx = cur-count;
while(cur>idx){
t = s[idx];
s[idx] = s[cur-1];
s[cur-1] = t;
idx++;
cur--;
}
count = 0;
}
}
//if(s.length()==count){
// reverse(s.begin(),s.end());
// return s;
//}
if(count!=0){
int len = s.length();
int idx = len-count;
while(len>idx){
t = s[idx];
s[idx] = s[len-1];
s[len-1] = t;
idx++;
len--;
}
}
return s;
}
};
只开辟字符串空间结果
字符串上修改结果