LeetCode151. 反转字符串中的单词
1.力扣151. 反转字符串中的单词2.LeetCode515.在每个树行中找最大值3.LeetCode104.二叉树的最大深度4.LeetCode111.二叉树的最小深度5.LeetCode136. 只出现一次的数字6.LeetCode260. 只出现一次的数字 III
7.LeetCode151. 反转字符串中的单词
8.LeetCode225. 用队列实现栈9.LeetCode102.二叉树的层序遍历10.LeetCode107.二叉树的层序遍历II11.LeetCode199.二叉树的右视图12.LeetCode637.二叉树的层平均值13.LeetCode226. 翻转二叉树14.LeetCode455.分发饼干15.LeetCode860. 柠檬水找零16.LeetCode122. 买卖股票的最佳时机 II17.LeetCode1005. K 次取反后最大化的数组和18.LeetCode53. 最大子数组和19.LeetCode513. 找树左下角的值20.LeetCode135. 分发糖果21.LeetCode222.完全二叉树的节点个数22.LeetCode700. 二叉搜索树中的搜索23.LeetCode98. 验证二叉搜索树24.LeetCode530. 二叉搜索树的最小绝对差25.LeetCode654. 最大二叉树26.LeetCode617. 合并二叉树27.回溯算法介绍以及模板28.LeetCode216.组合总和lll29.LeetCode39. 组合总和30.LeetCode40.组合总和II31.动态规划方法论32.线性dp:编辑距离33.线性dp:大盗阿福(打家劫舍)34.LeetCode300.最长递增子序列35.线性dp:LeetCode674. 最长连续递增序列36.线性dp:LeetCode516 .最长回文子序列37.线性dp:LeetCode122.买卖股票的最佳时机ll拿到这道题,我们想一下,我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了。
所以解题思路如下:
移除多余空格
将整个字符串反转
将每个单词反转
举个例子,源字符串为:"the sky is blue "
移除多余空格 : "the sky is blue"
字符串反转:"eulb si yks eht"
单词反转:"blue is sky the"
这样我们就完成了翻转字符串里的单词。
那么现在的思路就非常清晰明了了,先将整个字符串进行反转,再去除多余的空格,最后将每个单词进行反转
以下我对最难的部分---移除多余的空格进行讲解:
我们可以采用双指针的思想进行移除多余空格的操作,快指针用来遍历我们的数组,慢指针用于更新我们需要保留的元素的索引
不过有一个逻辑需要特别处理一下,就是要在每个单词之间加上空格(首单词除外)——判断逻辑可以表示为
if(slow!=0) s[slow++]=' ';
这样就可以做到在每个单词之间加上空格,并且去除首字母前面的空格了。
具体函数实现的代码如下:
//去除字符串中多余的空格 void removeExtraSpaces(string& s) { int fast = 0, slow = 0; for (fast = 0; fast < s.size(); fast++) { //快指针指向我们要保留的字符 if (s[fast] != ' ') { //将每个单词之间加上空格,首单词除外 if (slow != 0) s[slow++] = ' '; //将单词中间的空格去除 while (fast < s.size() && s[fast] != ' ') { s[slow++] = s[fast++]; } } } s.resize(slow); }
其余两个步骤的代码比较简单,我在这里就不过多赘述了
具体可以编译运行的代码如下:
class Solution { 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 fast = 0, slow = 0; for (fast = 0; fast < s.size(); fast++) { //快指针指向我们要保留的字符 if (s[fast] != ' ') { //将每个单词之间加上空格,首单词除外 if (slow != 0) s[slow++] = ' '; //将单词中间的空格去除 while (fast < s.size() && s[fast] != ' ') { s[slow++] = s[fast++]; } } } s.resize(slow); } string reverseWords(string& s) { //移除字符串中多余的空格 removeExtraSpaces(s); //反转这个字符串 reverse(s, 0, s.size() - 1); //反转这个字符串中的每一个单词 int start = 0; for (int i = 0; i <= s.size(); i++) { if ( i == s.size()||s[i]==' ') { reverse(s, start, i - 1); start = i + 1; } } return s; } };
合集:
LeetCode
分类:
LeetCode / 基础字符串
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章