一、题目
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = “Let’s take LeetCode contest”
输出:“s’teL ekat edoCteeL tsetnoc”
示例 2:
输入: s = “God Ding”
输出:“doG gniD”
提示:
1 <= s.length <= 5 * 104
s 包含可打印的 ASCII 字符。
s 不包含任何开头或结尾空格。
s 里 至少 有一个词。
s 中的所有单词都用一个空格隔开。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string-iii
二、思路
首先需要想到单个单词的反转方法,可以参考反转字符串
有了反转单词的方法后,下面就是分割字符串,本题中是按照空格来切割字符串的,那么我们可以找到一个空格后就将前面的字符串作为是一个单词进行反转,最后一个单词由于没有空格,属于我们需要再增加一次字符串反转的方法。具体做法为,定义快慢指针,让快慢指针都指向指向字符串,然后快指针可以找第一个空格,找到后从慢指针到快指针(不包含快指针指向的元素)前面的字符全部进行翻转,然后快指针加一,慢指针等于快指针。快指针继续寻找下一个空格,直到快指针为空。
三、C语言解法
void reverseString(char* s, int sSize){
int left=0,right=sSize-1;
char temp;
while(right>left){
temp = s[left];
s[left++] = s[right];
s[right--] = temp;
}
}
char * reverseWords(char * s){
int left=0,right=0;
while(s[right]!='\0'){
if(s[right] != ' ') right++;
else {
reverseString(&s[left],right-left);
right++;
left = right;
}
}
reverseString(&s[left],right-left);
return s;
}