一、题目
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
二、思路
1.简单思路
单词结尾,单词内部字符串反转。
2.使用额外空间
开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。
三、代码
1,C++
class Solution {
public:
string reverseWords(string s) {
int n=s.size();//长度
int begin=0,end;//开始和结束
for(int i=0;i<n+1;i++)
{
if(s[i]==' '||s[i]=='\0')//一个单词结尾
{
for(end=i-1;begin<end;begin++,end--)//单词中的字符串倒转
{
swap(s[begin],s[end]);
}
begin=i+1;
}
}
return s;
}
};
2.Java
class Solution {
public String reverseWords(String s) {
String[] strs = s.split(" ");
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < strs.length; i++) {
buffer.append(new StringBuffer(strs[i]).reverse().toString());
buffer.append(" ");
}
return buffer.toString().trim();
}
}
3.C++开辟新空间
class Solution {
public:
string reverseWords(string s) {
string ret;
int length = s.length();
int i = 0;
while (i < length) {
int start = i;
while (i < length && s[i] != ' ') {
i++;
}
for (int p = start; p < i; p++) {
ret.push_back(s[start + i - 1 - p]);
}
while (i < length && s[i] == ' ') {
i++;
ret.push_back(' ');
}
}
return ret;
}
};
四、总结
1,原地解法
时间复杂度:O(N)。字符串中的每个字符要么在 O(1) 的时间内被交换到相应的位置,要么因为是空格而保持不动。
空间复杂度:O(1)。因为不需要开辟额外的数组。
2.开辟新空间
时间复杂度:O(N),其中 N 为字符串的长度。原字符串中的每个字符都会在 O(1)O(1) 的时间内放入新字符串中。
空间复杂度:O(N)。我们开辟了与原字符串等大的空间。