题目:
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-words-in-a-string-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
点此跳转LeetCode-557. 反转字符串中的单词 III
示例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. 在字符串 s 最后添加一个空格辅助判断,并将字符串 s 转换成数组;
2. 遍历 s,每当遇到空格则对 start 到空格前面部分进行反转,更新 start 的值;
3. 删除添加的空格,并将数组 s 转为字符串。
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
s += ' '; // 在 s 最后加一个空格辅助判断
s = s.split(''); // 把 s 转换为数组
for (let i = 0, len = s.length, start = 0; i < len; i++) {
if (s[i] == ' ') {
reverse(s, start, i - 1);
start = i + 1; // 更新 start 的值
}
}
s.pop(); // 删除添加的空格
return s.join('');
};
var reverse = (arr, start, end) => {
for (let tmp = ''; start < end; start++, end--) {
tmp = arr[start];
arr[start] = arr[end];
arr[end] = tmp;
}
}
解法二:
原字符串:
s = "Let's take LeetCode contest"
1. 将字符串 s 用空格' ' 分隔开得到数组 s 如下:
s = ["Let's", "take", "LeetCode", "contest"]
2. 遍历数组中的每一个元素,依次反转,如下:
s = ["s'teL", "ekat", "edoCteeL", "tsetnoc"]
3. 最后将数组 s 转换为 字符串,并用空格分隔即可
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
s = s.split(' ');
for (let i = 0, len = s.length; i < len; i++) {
s[i] = s[i].split('').reverse().join('');
}
return s.join(' ');
};