北京城乡建设部网站,sem推广平台有哪些,c .net怎么做网站,校园网拓扑图设计方案摘要#xff1a; Leetcode的AC指南 —— 字符串#xff1a;151. 反转字符串中的单词。题目介绍#xff1a;给你一个字符串 s #xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序… 摘要 Leetcode的AC指南 —— 字符串151. 反转字符串中的单词。题目介绍给你一个字符串 s 请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中单词间应当仅用单个空格分隔且不包含任何额外的空格。 文章目录 一、题目二、解析1、 其他语言版本JavaCPython 一、题目 题目介绍给你一个字符串 s 请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中单词间应当仅用单个空格分隔且不包含任何额外的空格。
力扣题目链接
示例 1:
输入s the sky is blue
输出blue is sky the示例 2:
输入s hello world
输出world hello
解释反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入s a good example
输出example good a
解释如果两个单词间有多余的空格反转后的字符串需要将单词间的空格减少到仅有一个。提示 1 s.length 104 s 包含英文大小写字母、数字和空格 ’ ’ s 中 至少存在一个 单词 进阶
如果字符串在你使用的编程语言中是一种可变数据类型请尝试使用 O(1) 额外空间复杂度的 原地 解法。
二、解析 1、
思路
移除多余空格将整个字符串反转将每个单词反转
移除多余空格可以参考 27.移除元素
字符串的反转可以参考 344.反转字符串
go
func reverseWords(s string) string {b : []byte(s)// 采用快慢指针移除前面、中间、后面存在的多余空格slow : 0for i : 0; i len(b); i {if b[i] ! {if slow ! 0 { // 在每个单词间添加空格b[slow] slow}for i len(b) b[i] ! {// 在数组中覆盖空格将单词向前移动// 并且将slow和i指针指向该单词后的第一个空格b[slow] b[i]slowi}}}b b[0:slow] // 用修改后的数组对原数组进行覆盖// 翻转整个字符串reverse(b)// 翻转每个单词last : 0for i : 0; i len(b); i {if i len(b) || b[i] {reverse(b[last:i])last i 1}}return string(b)
}func reverse(b []byte) {left : 0right : len(b) - 1for left right {b[left], b[right] b[right], b[left]leftright--}
}
时间复杂度: O(n)空间复杂度: O(1)
其他语言版本 Java
class Solution {/*** 不使用Java内置方法实现* p* 1.去除首尾以及中间多余空格* 2.反转整个字符串* 3.反转各个单词*/public String reverseWords(String s) {// System.out.println(ReverseWords.reverseWords2() called with: s [ s ]);// 1.去除首尾以及中间多余空格StringBuilder sb removeSpace(s);// 2.反转整个字符串reverseString(sb, 0, sb.length() - 1);// 3.反转各个单词reverseEachWord(sb);return sb.toString();}private StringBuilder removeSpace(String s) {// System.out.println(ReverseWords.removeSpace() called with: s [ s ]);int start 0;int end s.length() - 1;while (s.charAt(start) ) start;while (s.charAt(end) ) end--;StringBuilder sb new StringBuilder();while (start end) {char c s.charAt(start);if (c ! || sb.charAt(sb.length() - 1) ! ) {sb.append(c);}start;}// System.out.println(ReverseWords.removeSpace returned: sb [ sb ]);return sb;}/*** 反转字符串指定区间[start, end]的字符*/public void reverseString(StringBuilder sb, int start, int end) {// System.out.println(ReverseWords.reverseString() called with: sb [ sb ], start [ start ], end [ end ]);while (start end) {char temp sb.charAt(start);sb.setCharAt(start, sb.charAt(end));sb.setCharAt(end, temp);start;end--;}// System.out.println(ReverseWords.reverseString returned: sb [ sb ]);}private void reverseEachWord(StringBuilder sb) {int start 0;int end 1;int n sb.length();while (start n) {while (end n sb.charAt(end) ! ) {end;}reverseString(sb, start, end - 1);start end 1;end start 1;}}
}
C
public:void reverse(string s, int start, int end){ //翻转区间写法左闭右闭 []for (int i start, j end; i j; i, j--) {swap(s[i], s[j]);}}void removeExtraSpaces(string s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。int slow 0; //整体思想参考https://programmercarl.com/0027.移除元素.htmlfor (int i 0; i s.size(); i) { //if (s[i] ! ) { //遇到非空格就处理即删除所有空格。if (slow ! 0) s[slow] ; //手动控制空格给单词之间添加空格。slow ! 0说明不是第一个单词需要在单词前添加空格。while (i s.size() s[i] ! ) { //补上该单词遇到空格说明单词结束。s[slow] s[i];}}}s.resize(slow); //slow的大小即为去除多余空格后的大小。}string reverseWords(string s) {removeExtraSpaces(s); //去除多余空格保证单词之间之只有一个空格且字符串首尾没空格。reverse(s, 0, s.size() - 1);int start 0; //removeExtraSpaces后保证第一个单词的开始下标一定是0。for (int i 0; i s.size(); i) {if (i s.size() || s[i] ) { //到达空格或者串尾说明一个单词结束。进行翻转。reverse(s, start, i - 1); //翻转注意是左闭右闭 []的翻转。start i 1; //更新下一个单词的开始下标start}}return s;}
};
Python
class Solution:def reverseWords(self, s: str) - str:# 删除前后空白s s.strip()# 反转整个字符串s s[::-1]# 将字符串拆分为单词并反转每个单词s .join(word[::-1] for word in s.split())return s
class Solution:def reverseWords(self, s: str) - str:# 将字符串拆分为单词即转换成列表类型words s.split()# 反转单词left, right 0, len(words) - 1while left right:words[left], words[right] words[right], words[left]left 1right - 1# 将列表转换成字符串return .join(words)