开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情
一、题目描述:
557. 反转字符串中的单词 III - 力扣(LeetCode) (leetcode-cn.com)
给定一个字符串 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 中的所有单词都用一个空格隔开。
二、思路分析:
因为Java的String是不可变的,所以需要额外的空间(创建char数组)。
采用双指针(快慢指针)的解法,快指针负责检查空格,慢指针定在单词的第0个字符。
所以当快指针所指向的字符为空格或者超出数组长度时,将慢指针与快指针-1之间的字符进行反转。
反转的代码类似【344. 反转字符串】,采用头尾指针进行反转。
最后将char数组转换为String返回即可。
三、AC 代码:
class Solution {
public String reverseWords(String s) {
char[] arr = s.toCharArray();
int slow=0, fast=0;
while(fast<=arr.length) {
if(fast==arr.length || arr[fast]==' ') {
//reverse arr between slow and fast-1
int i=slow, j=fast-1;
while(i<j) {
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
fast++;
slow = fast;
}else {
fast++;
}
}
return new String(arr);
}
}
范文参考:
超过100% Java 超简单解题思路 原地解法 - 反转字符串中的单词 III - 力扣(LeetCode)
【track & traning】一行代码,思路简单,性能高效接近100 - 反转字符串中的单词 III - 力扣(LeetCode)
关于字符串反转的三种不同实现(反转字符串中的单词 III) - 反转字符串中的单词 III - 力扣(LeetCode)