leetcode算法557. 反转字符串中的单词 III

125 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 中的所有单词都用一个空格隔开。

二、思路分析:

  1. 首先快慢指针初值为0;
  2. 判断慢指针所指字符是否为空字符,如果是,快慢指针都加一,并将单词标志位置0,如果不是,则将单词标志位置1(通过这样的操作,在找到单词的首字母的同时,保证了快慢指针相等);
  3. 如果单词标志位为1,说明找到单词的首字母,接下来的任务是找到单词的结束位置,于是判断快指针所指的字符是否为空字符,如果不是,则快指针加一,如果是,则说明快指针上一次所指的字符是单词的最后一个字母,于是可以逆转单词了,之后将快指针赋值给慢指针;
  4. 继续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--;
    }
}