持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
一、题目描述:
557. 反转字符串中的单词 III - 力扣(LeetCode)
给定一个字符串 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 中的所有单词都用一个空格隔开。
二、思路分析:
- 首先快慢指针初值为0;
- 判断慢指针所指字符是否为空字符,如果是,快慢指针都加一,并将单词标志位置0,如果不是,则将单词标志位置1(通过这样的操作,在找到单词的首字母的同时,保证了快慢指针相等);
- 如果单词标志位为1,说明找到单词的首字母,接下来的任务是找到单词的结束位置,于是判断快指针所指的字符是否为空字符,如果不是,则快指针加一,如果是,则说明快指针上一次所指的字符是单词的最后一个字母,于是可以逆转单词了,之后将快指针赋值给慢指针;
- 继续2,3步,直至在找到单词的同时,快指针指向字符串结束符'\0',此时逆转单词,然后结束。
三、AC 代码:
char * reverseWords(char * s){
void ReverseOneWord(char *s, int staInd, int endInd);//函数声明
int i;
int slow=0, fast=0;
int flag=0;
while(*(s+fast)!='\0')
{
if(*(s+slow)==' ')
{
slow++;
fast++;
flag=0;
}
else
flag=1;
//遇到单词的一个字母时,才fast指针才比slow指针快,此时,将flag置1
if(flag==1 && *(s+fast)!=' ')
fast++;
else if(flag==1 && *(s+fast)==' ')
{
ReverseOneWord(s, slow, fast-1);//逆转单词
slow = fast;
}
if(flag==1 && *(s+fast)=='\0')//针对最后一个单词的处理
{
ReverseOneWord(s, slow, fast-1);//逆转单词
}
}
return s;
}
void ReverseOneWord(char *s, int staInd, int endInd)
{
char temp;
while(staInd<endInd)
{
temp = *(s+endInd);
*(s+endInd) = *(s+staInd);
*(s+staInd) = temp;
staInd++;
endInd--;
}
}