日新刷题 - 557. 反转字符串中的单词 III

207 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

一、题目描述:

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

给定一个字符串 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,字符串停止继续前移,通过双指针先将这个单词里的字母进行位置转换,转换之后再去判断是否遇到空格,此时遇到之后下标继续往后去处理下一个单词,以此类推将一个句子中的字母进行调整。

范文参考:

python一行代码:s.reverse() 及理解 - 反转字符串中的单词 III - 力扣(LeetCode)