PHP 翻转字符串里的单词 - LeetCode 151 实

「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战

今天说一下翻转字符串里的单词

image.png

实现思路

今天这个题目还是比较简单的,我们可以直接使用PHP内置的函数操作字符串,返回翻转后的结果。

空格有一个或多个,出现在字符串首尾或单词中间。

  • 我们可以先去掉首尾的空格,然后再把单词中间的空格变成1个,再把每个单词放入数组中,最后翻转数组输出每个元素。
  • 我们也可以直接遍历字符串,记录下每个单词放入数组中,最后翻转数组输出每个元素。

上面这两个方法使用了PHP内置的函数或者遍历多次字符串。下面说一下只遍历一次字符串就可以得出结果的方法。

首先我们反向遍历整个字符串,不管两个单词中间有多少空格,只要当前位置为空格,并且当前位置的前一个位置不是空格,就说明到了一个单词的边缘,需要把这个单词提取出来。

由于只是翻转字符串单词的顺序,并不是要每个单词字母也翻转,所以需要先把遍历的字符串的每个字符存入一个变量中,待遍历到单词边缘时,把整个单词放入结果中。

  • 遇到非空格时,把当前字符放入一个变量中。
  • 遇到空格时,判断当前位置的前一个字符是否为空格,如果不是空格,说明在一个单词的边缘,则把临时存放的单词放入结果中。

上面是一个大概的思路,还有一些首尾空格的处理问题,下面跟着代码详细讲一下。

完整代码

image.png

第725行代码,获取字符串长度,这里假设真个字符串没有中文。

第726行代码,定义一个变量,翻转后的结果字符串。

第727行代码,定义一个变量,临时存放单个单词。

第728-746行代码,遍历整个字符串。

第729-736行代码,当前遍历的字符为非空格时,把当前字符放入临时存放单词的变量$currentWord中,由于是反向遍历字符串,所以需要每次把当前字符当作开头与$currentWord连接起来。

如果当前遍历位置为0,也就是字符串的第一个字符位置。也就是说字符串的第一个位置为非空格时,由于已经没有其他空格字符当作整个单词的边界去判断,所以需要把当前存放的单词与整个翻转的字符串$execWords连接。

第737-745行代码,当前字符为空格,并且上一个位置(由于反向遍历字符串,所以上一个位置是$i+1)字符为非空格时,是一个单词的边界位置,此时说明存放单词的变量中已经是一个完整的单词了。如果上一个位置也是空格则表示是连续的空格。

为什么有这个判断呢?

1
php复制代码$i < $len - 1

因为当第一个位置的字符就是空格时,此时没有上一个位置,所以需要从第二个位置开始判断。

符合上面的条件,则把当前存放的单词与整个翻转的字符串$execWords连接,并把存放的单词变量$currentWord清空,以便记录下一个单词。

第748行代码,返回翻转后的字符串。

代码中732-734和739-741行代码没有具体说明,这个判断是处理首尾空格问题的,当翻转后字符串需要连接一个新单词时,不管是通过

1
php复制代码$execWords .= ' ' . $currentWord;

还是通过

1
php复制代码$execWords .= $currentWord . ' ';

都会造成首个单词前面或者最后一个单词后面出现一个空格。通过这个判断就可以避免这种清空。

另外我们也可以去掉这两个判断,使用下面的方式,得到完整的翻转后的字符串再处理。

1
php复制代码$execWords = trim($execWords);

只不过是使用了PHP的内置函数。

下面是在leetCode上执行的结果,感觉还不错。

Snipaste_2021-11-28_19-47-13.png

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%