给定一个字符串
s
,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例 1:
输入:s = "Let's take LeetCode contest" 输出:"s'teL ekat edoCteeL tsetnoc"示例 2:
输入: s = "Mr Ding" 输出:"rM gniD"提示:
1 <= s.length <= 5 * 104
s
包含可打印的 ASCII 字符。s
不包含任何开头或结尾空格。s
里 至少 有一个词。s
中的所有单词都用一个空格隔开
解题思路:双指针法,从字符串开始位置从前向后找' ',pos为find返回的下标位置,再设置一指针pre记录当前pos位置 ,再让pos指向下一个空格,再次用pre记录位置,直到pos为npos(当find找不到时返回npos),此时pos位置时最后一个空格的位置,但后面还有一个单词没有反转,在返回前反转最后一个单词即可
class Solution {
public:
void reserve(string& s, int begin, int end)
{
while (begin < end)
{
swap(s[begin++], s[end--]);
}
}
string reverseWords(string& s) {
//找空格,直到等于npos
//设置一个pre指针指向上一次find的位置
int pre = 0, pos;
while (1)
{
pos = s.find(' ', pre);
if (pos == string::npos)
{
reserve(s, pre, s.size() - 1);
return s;
}
reserve(s, pre, pos - 1);
pre = pos + 1;//此刻二者都指向' '
}
}
};