携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
一、题目描述:
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
示例 2:
输入: s = "God Ding"
输出:"doG gniD"
提示:
- 1 <= s.length <= 5 * 10^4
- s 包含可打印的 ASCII 字符。
- s 不包含任何开头或结尾空格。
- s 里 至少 有一个词。
- s 中的所有单词都用一个空格隔开。
二、思路分析:
将反转字符串中的每个单词转化成多个一次反转一个单词的问题; 用i指针找到空格的位置,分割每个单词,然后就用双指针进行反转,反转完后进行右指针的更新,right=i+1;每个单词反转后字符数不变,故可接续运行。 最后一个单词由于字符串的末尾没有空格,故需要单独提出进行反转。
三、AC 代码:
class Solution {
public:
string reverseWords(string s) {
int len=s.length();
int right=0;
int left;
for (int i=0;i<len;i++)
{
if(s[i]==' ')
{
left=i-1;
while(right<left)
{
int temp=s[left];
s[left]=s[right];
s[right]=temp;
left--;
right++;
}
right=i+1;
}
}
left=len-1;
while(right<left)
{
int temp=s[left];
s[left]=s[right];
s[right]=temp;
left--;
right++;
}
return s;
}
};
四、总结:
这道题主要思路:通过空格将一句话中的几个单词分开,之后再通过双指针将分开的单词里的字母进行调换
先去判断是否遇到空格,如果遇到了此时停下i,字符串停止继续前移,通过双指针先将这个单词里的字母进行位置转换,转换之后再去判断是否遇到空格,此时遇到之后下标继续往后去处理下一个单词,以此类推将一个句子中的字母进行调整。