当前位置: 首页 > news >正文

leetcode151:反转字符串中的单词(正则化预处理与双指针原地解法)

文章目录

  • 一、题目描述
  • 二、思路分析
  • 三、代码实现(Java / 简洁版)
    • 复杂度
  • 四、进阶:O(1) 空间双指针原地解法
  • 五、小结

LeetCode 151. 反转字符串中的单词,(难度:中等;通过率:59.1%),这道题看似简单,却暗藏 字符串预处理双指针技巧 两大经典套路。本文先给出一行正则 + split 的简洁做法,再分享 O(1) 额外空间的原地双指针思路


一、题目描述

给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词由非空格字符组成,s 中使用至少一个空格将单词分隔开。返回单词顺序颠倒且单词之间仅用单个空格连接的结果

示例:

输入输出
"the sky is blue""blue is sky the"
" hello world ""world hello"
"a good example""example good a"

额外要求(进阶):如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度原地解法


二、思路分析

  1. 去除冗余空格:题目要求结果中只有一个空格分隔,意味着要去掉首尾空格 + 压缩中间多个空格
  2. 单词分割:一旦空格处理完毕,利用分割即可拿到所有单词
  3. 反转组合:将分割得到的单词倒序拼接即可

关键坑点:直接对原字符串 split(" ") 会把连续空格分割出很多 “” 空串,导致结果错误。因此需要使用正则 or 双指针先压缩空格


三、代码实现(Java / 简洁版)

下面这段代码利用正则 "\\s+"1~N 个空白字符视为分隔符,一行搞定空格压缩 + 分割,随后倒序拼接即可

class Solution {public String reverseWords(String s) {// 1.去除首尾空格,按连续空白分割得到单词数组String[] words = s.trim().split("\\s+");// 2.倒序拼接StringBuilder sb = new StringBuilder();for (int i = words.length - 1; i >= 0; i--) {sb.append(words[i]);if (i > 0) sb.append(' '); // 单词间加空格}return sb.toString();}
}

提交结果:

在这里插入图片描述

复杂度

  • 时间复杂度O(N)trimsplit 均线性扫描一次
  • 空间复杂度O(N)split 产生的数组存储单词

四、进阶:O(1) 空间双指针原地解法

如果思考能否原地反转?可以考虑:

  1. 先将整串字符反转
  2. 再逐个单词反转回来
  3. 最后在同一数组中压缩冗余空格

这个思路,有些类似leetcode189:轮转数组(原地后移数组的最佳实践解法)中的三次翻转法

示意步骤(以 " hello world " 为例):

原字符串:__hello__world__
1) 整串反转:__dlrow__olleh__
2) 单词反转:__world__hello__
3) 空格压缩:world hello

该方法仅使用常数级双指针变量,满足 O(1) 额外空间

完整代码如下:

class Solution {// 原地反转 + 双指针,O(1) 额外空间public String reverseWords(String s) {char[] ch = s.toCharArray();int n = ch.length;// 1.整串反转reverse(ch, 0, n - 1);// 2.逐个单词反转回来int start = 0, end;while (start < n) {// 跳过空格while (start < n && ch[start] == ' ') {start++;}if (start >= n) break;end = start;while (end < n && ch[end] != ' ') {end++;}reverse(ch, start, end - 1);start = end;}// 3.压缩空格并构建结果StringBuilder sb = new StringBuilder();for (int i = 0; i < n; ) {if (ch[i] != ' ') {sb.append(ch[i++]);} else {sb.append(' '); // 保留一个空格while (i < n && ch[i] == ' ') {i++; // 跳过多余空格}}}// 4.去除首尾可能的空格int len = sb.length();if (len > 0 && sb.charAt(0) == ' ') {sb.deleteCharAt(0);}if (len > 1 && sb.charAt(sb.length() - 1) == ' ') {sb.deleteCharAt(sb.length() - 1);}return sb.toString();}private void reverse(char[] ch, int l, int r) {while (l < r) {char tmp = ch[l];ch[l++] = ch[r];ch[r--] = tmp;}}
}

提交结果:

在这里插入图片描述


五、小结

  • 字符串题目常见套路:预处理 → 分割/提取 → 再处理/拼接
  • 正则 "\\s+" 在需要压缩连续空白时非常好用;注意 trim() 只能去除首尾空白
  • 关注进阶条件:能否 O(1) 空间 / 原地解。不一定要写出,但要思路清晰

文章转载自:

http://RZJH609e.ftnhr.cn
http://nSiWvpK7.ftnhr.cn
http://0jfCSuJf.ftnhr.cn
http://A3kvWZBm.ftnhr.cn
http://Y6koBeH3.ftnhr.cn
http://iwGPzUka.ftnhr.cn
http://LUsdQFyg.ftnhr.cn
http://onFbxHqD.ftnhr.cn
http://vWCfUDDd.ftnhr.cn
http://GkdIazPD.ftnhr.cn
http://j8inwR1k.ftnhr.cn
http://tXBGg8M6.ftnhr.cn
http://vsjusw7z.ftnhr.cn
http://TDWlprOl.ftnhr.cn
http://HLc48kW6.ftnhr.cn
http://huW1k3mD.ftnhr.cn
http://M6rLjgIs.ftnhr.cn
http://CbQqxyBO.ftnhr.cn
http://xybcqYfB.ftnhr.cn
http://wkEy3suY.ftnhr.cn
http://t6qfIsrn.ftnhr.cn
http://peMCK2VE.ftnhr.cn
http://irbucNwE.ftnhr.cn
http://5Mfm5DR0.ftnhr.cn
http://Ukk7Zw6c.ftnhr.cn
http://TeRjzShf.ftnhr.cn
http://kRUDAwoJ.ftnhr.cn
http://L7wqLRvB.ftnhr.cn
http://OtIsXWdh.ftnhr.cn
http://tQpy4NOT.ftnhr.cn
http://www.dtcms.com/a/381383.html

相关文章:

  • 解锁 Ray 在 Kubernetes 上的弹性伸缩:打造高效、稳定的分布式作业
  • leetcode33(最小栈)
  • 二进制部署k8s
  • 为什么知识复用时缺乏场景化指导影响实用性
  • 基于Matlab可见光通信系统中OOK调制的误码率性能建模与分析
  • 《Linux线程——从概念到实践》
  • Android相机API2,基于GLSurfaceView+SurfaceTexture实现相机预览,集成的相机算法采用GPU方案,简要说明
  • 美团核销接口,第三方服务商零侵入对接的核心步骤与技巧美团核销接口
  • Java导出复杂excel,自定义excel导出
  • 【SLT库】红黑树的原理学习 | 模拟实现
  • 【轨物方案】赋能绿色能源新纪元:轨物科技发布光伏清洁机器人智能控制与运维解决方案
  • React Hooks原理深度解析与高级应用模式
  • React 原理篇 - 深入理解虚拟 DOM
  • [能源化工] 面向锂电池RUL预测的开源项目全景速览
  • 分布式专题——10.5 ShardingSphere的CosID主键生成框架
  • 【Redis#9】其他数据结构
  • C++使用拉玛努金公式计算π的值
  • 上海市2025CSP-J十连测Round 5卷后感
  • RDB/AOF------Redis两大持久化方法
  • 【图解】idea中快速查找maven冲突
  • Dubbo SPI机制
  • 《Linux 基础指令实战:新手入门的命令行操作核心教程(第一篇)》
  • 【开题答辩全过程】以 “饭否”食材搭配指南小程序的设计与实现为例,包含答辩的问题和答案
  • RabbitMQ 在实际开发中的应用场景与实现方案
  • 有没有什么办法能批量去除很多个PDF文件的水印
  • JavaScript 内存管理与常见泄漏排查(闭包、DOM 引用、定时器、全局变量)
  • ArkAnalyzer源码初步分析I——分析ts项目流程
  • Linux_基础指令(二)
  • 什么是子网?
  • 【前端】【utils】高效文件下载技术解析