题目描述
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例:
输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"
解题思路
《剑指offer》第58题翻转字符串,题目一的“第二次翻转”过程,这部分还是要重点看下循环条件的。
参考代码
《剑指offer》上的方式
class Solution {
public:
string reverseWords(string str) {
int length = str.length();
if(length == 0)
return "";
int mBegin = 0, mEnd = 0;
while(mBegin != length){
if(str[mBegin] == ' '){
mBegin++;
mEnd++;
}else if(str[mEnd] == ' ' || mEnd == length){
mReverse(str, mBegin, --mEnd);
mBegin = ++mEnd;
}else{
mEnd++;
}
}
return str;
}
void mReverse(string &str, int low, int high){
while(low < high){
swap(str[low], str[high]);
low++, high--;
}
}
};
更好记的思路:(推荐)
class Solution {
public:
//使用双指针交换字符 字符串 左边位置 右边位置
void reserve(string& str,int left,int right){
while(left < right){
swap(str[left],str[right]);
left++;
right--;
}
}
string reverseWords(string s) {
int front = 0;//初始位置
for (int i = 0; i < s.length(); i++) {
if (s[i] == ' ') {
reserve(s, front, i - 1);
front = i + 1;//更新初始位置,变为‘ ’后面的一个字符
}
}
reserve(s, front, s.length() - 1);//对最后一个单词的反转
return s;
}
};