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

135 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

给定一个字符串 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 中的所有单词都用一个空格隔开。

题解

1.暴力解法

通过 js 中的 字符串的分割 split 方法 和 数组的 reversejoin 方法 来进行处理。

先将字符串 通过空格进行分割,得到每个单词的数组。

之后再遍历每个单词,将每个字符进行分割后 得到新的数组,再将数组进行翻转,最后合并数组得到 单个翻转后的单词

最后我们将数组内,每个翻转后的单词 合并起来,即可得到结果。

此方法为暴力破解,并不是一个常规的算法型的方式 来解的。

    const reverseWords = (s) => {
      const sSplit = s.split(' ')

      const newSplit = sSplit.map((item) => {
        return item.split('').reverse().join('')
      })

      return newSplit.join(' ')
    }

2.通过双指针算法来处理

记录开始位置,只要遇到空格 就 反向 push 到数组中。

    let reverseWords = s => {
        let res = [];
        let i = 0;
        while(i < s.length){
            let start = i;
            while(i < s.length && s[i] !== ' ') i++; // 未遇到空格,i一直往前走
            for(let t = i - 1; t >= start; t--){ //从上面while出来,表明走出一个完整的单词了
                res.push(s[t]); //将单词的字符倒着放入res中
            }
            while(i < s.length && s[i] == ' ') {
                i++;
                res.push(' '); // 添加字符间的空格
            }
        }
        return res.join('');
    }

总结

题目 4,出现了很多技巧点及好的思路。而且要对js的相关方法要有熟练记忆和使用。