[LeetCode] 151. Reverse Words in a String 翻转字符串中的单词
Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
Update (2015-02-12):
For C programmers: Try to solve it in-place in O(1) space.
Clarification:
- What constitutes a word?
- A sequence of non-space characters constitutes a word.
- Could the input string contain leading or trailing spaces?
- Yes. However, your reversed string should not contain leading or trailing spaces.
- How about multiple spaces between two words?
- Reduce them to a single space in the reversed string.
把一个字符串中的单词逆序,单词字符顺序不变。
解法1: New array, 新建一个数组,把字符串以空格拆分成单词存到数组,在把单词逆序拷贝进新数组。
解法2: One place,不能新建数组,在原数组的基础上换位。把字符串的所以字符逆序,然后在把每个单词的字符逆序。
Java: New array, two pass
public String reverseWords(String s) { String[] words = s.trim().split("\\s+"); if(words.length == 0) { return ""; } StringBuilder sb = new StringBuilder(words[words.length-1]); for(int i=words.length-2; i >=0; i--) { sb.append(" "+words[i]); } return sb.toString(); }
Java: New array, one pass
public String reverseWords(String s) { StringBuilder sb = new StringBuilder(); int end = s.length(); int i = end-1; while(i>=0) { if(s.charAt(i) == ' ') { if(i < end-1) { sb.append(s.substring(i+1, end)).append(" "); } end = i; } i--; } sb.append(s.substring(i+1, end)); return sb.toString().trim(); }
Java: New array, one pass
public String reverseWords(String s) { StringBuilder sb = new StringBuilder(); int last = s.length(); for(int i=s.length()-1; i>=-1; i--) { if(i==-1 || s.charAt(i)==' ') { String word = s.substring(i+1, last); if(!word.isEmpty()) { if(sb.length() != 0) sb.append(' '); sb.append(word); } last = i; } } return sb.toString(); }
Java:One place
public String reverseWords(String s) { if(s == null || s.isEmpty()) return s; char[] data = s.toChartArray(); int n = data.length; reverse(data, 0, n-1); int last = -1; for(int i=0; i<=n; i++) { if(i == n || data[i] == ' ') { if(i-last>1) reverse(data, last+1, i-1); last = i; } } return new String(data); } private void reverse(char[] data, int start, int end) { while(start < end) { char tmp = data[start]; data[start++] = data[end]; data[end--] = tmp; } }
Python: New array
class Solution: # @param s, a string # @return a string def reverseWords(self, s): return ' '.join(reversed(s.split()))
C++:
class Solution { public: void reverseWords(string &s) { int storeIndex = 0, n = s.size(); reverse(s.begin(), s.end()); for (int i = 0; i < n; ++i) { if (s[i] != ' ') { if (storeIndex != 0) s[storeIndex++] = ' '; int j = i; while (j < n && s[j] != ' ') s[storeIndex++] = s[j++]; reverse(s.begin() + storeIndex - (j - i), s.begin() + storeIndex); i = j; } } s.resize(storeIndex); } };
类似题目:
[LeetCode] 186. Reverse Words in a String II 翻转字符串中的单词 II
[LeetCode] 557. Reverse Words in a String III 翻转字符串中的单词 III
All LeetCode Questions List 题目汇总
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)