题目:

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:

输入: "the sky is blue"
输出: "blue is sky the"

示例 2:

输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:

输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

  • 无空格字符构成一个单词。
  • 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  • 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

进阶:

请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。

解题思路:

首先把字符串左右两边多余的空格给去掉,然后用两个指针分别从两段开始向中间扫描,将扫描到的左、右两个单词进行交换。这交换过程中注意下标的变换,因为两个单词长度不一定相等。

代码:

 class Solution {
public:
string reverseWords(string s) {
string temp;
int l1,l2,r1,r2;
l1=,r2=s.size()-;
// 第一步:先把字符串两边的空格给去掉
while(l1 <= r2) { //1、这里取等于 可以处理 s=" " 这种特殊情况,即输出""
if(s[l1] == ' '){
s.erase(l1,);
r2--; //2、这里是r2改变,而不是l1,l1实际不需要改变
}
else
break; }
while(l1 < r2 ) {
if(s[r2] == ' '){
s.erase(r2,);
r2--;
}
else
break;
}
// 第二步:尺取左、右两个单词长度,然后交换两个单词,不断重复这个过程
while(l1 < r2)
{
temp.clear();
for(r1=l1; r1<r2 && s[r1+] != ' '; ++r1); //3、找到两个单词边界
for(l2=r2; l2>l1 && s[l2-] != ' '; --l2);
if(r1 >= l2) //4、若只剩一个单词,则不必处理,直接退出
break;
int len1=r1-l1+;
int len2=r2-l2+;
temp = s.substr(l1, len1);
s.erase(l1,len1);
l2 = l2-len1; //5、删除左边那个单词时,应该改变l2的值,但l1不用改变
s.insert(l1,s.substr(l2,len2));
l2 = l2+len2; //6、插入之后l1,l2都要改变,因为l1要变为插入单词的下一个位置
l1 = l1+len2;
s.erase(l2,len2);
s.insert(l2,temp); //7、删除第l2位置开始的单词,再从该位置插入新单词。刚开始以为l2要减一,但其实insert(index,string)的用法是从index开始插入,而不是从index的后一个开始
l2--; //8、插入单词的前一个位置
r2=l2;
// 第三步:处理字符串内部多余空格
int i,j;
if(l1 >= r2) //9、同4
break;
else{
for(i=l1; i<r2 && s[i+] == ' '; ++i); //10、找出左右多余空格
for(j=r2; j>l1 && s[j-] == ' '; --j);
if(i == j) //11、若位置l1和r2之间已经没有多余的单词,并且只有一个空格,则保留这个空格并结束
break;
else if(i > j) //12、若位置l1和r2之间已经没有多余的单词,但有多个空格,则删除多余的,只保留一个空格即可
{
s.erase(l1,i-l1);
r2=r2-(i-l1);
break;
}
//13、若位置l1和r2之间还有单词,则删除两边多余的空格
s.erase(l1,i-l1);
j=j-(i-l1);
r2=r2-(i-l1);
s.erase(j,r2-j);
r2=j-;
l1++;
} }
return s;
}
};

LeetCode 151 翻转字符串里的单词的更多相关文章

  1. C#版(击败100.00%的提交) - Leetcode 151. 翻转字符串里的单词 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  2. LeetCode 151. 翻转字符串里的单词(Reverse Words in a String)

    151. 翻转字符串里的单词 151. Reverse Words in a String

  3. Java实现 LeetCode 151 翻转字符串里的单词

    151. 翻转字符串里的单词 给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky th ...

  4. 微软面试题: LeetCode 151. 翻转字符串里的单词 出现次数:6

    题目描述: 给定一个字符串,逐个翻转字符串中的每个单词. 说明: 无空格字符构成一个 单词 .输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括.如果两个单词间有多余的空格,将反转后 ...

  5. leetcode python翻转字符串里的单词

    # Leetcode 151 翻转字符串里的单词### 题目描述给定一个字符串,逐个翻转字符串中的每个单词. **示例1:** 输入: "the sky is blue" 输出: ...

  6. 【LeetCode】151. 翻转字符串里的单词(剑指offer 58-I)

    151. 翻转字符串里的单词 知识点:字符串:双指针 题目描述 给你一个字符串 s ,逐个翻转字符串中的所有 单词 . 单词 是由非空格字符组成的字符串.s 中使用至少一个空格将字符串中的 单词 分隔 ...

  7. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串

    第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...

  8. 力扣(LeetCode)翻转字符串里的单词 个人题解

    给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky the" 示例 2: 输 ...

  9. 【算法训练营day8】LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58-II. 左旋转字符串

    [算法训练营day8]LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58- ...

随机推荐

  1. idea ----> 使用idea工具整合mybaiti时出现的问题总结

    使用idea测试mabtis实例时出现  java.lang.IllegalArgumentException: Mapped Statements collection does not conta ...

  2. Android中简单活动窗口的切换--Android

    本例实现Android中简单Activity窗口切换:借助intent(意图)对应用操作(这里用按钮监听)等的描述,Android根据描述负责找对应的组件,完成组件的调用来实现活动的切换……案例比较简 ...

  3. python基础之 025 模块加载与import的使用

    内容梗概: 1. 模块 2. import 3. from xxx import xxx 1.模块定义:模块就是一个包含了python定义和声明的文件,文件名就是模块的名字加上.py后缀.目前写的所有 ...

  4. python基础之生成器,生成器函数,列表推导式

    内容梗概: 1. 生成器和生成器函数. 2. 列表推导式. 1.生成器函数1.1 生成器函数. 就是把return换成yield def gen(): print("爽歪歪") y ...

  5. DP 传球问题

    洛谷P1057 传球问题 分析:经过m次传球到第i个人的方法可以由经过m-1次传球到第i个人和到第i-1个人传递得来 设dp[i][j]为经过j次传球后到达第i个人的方法数,可得到状态转移方程为: d ...

  6. Wannafly挑战赛27-A/B

    链接:https://www.nowcoder.com/acm/contest/215/A来源:牛客网 题目描述 “White shores, and beyond. A far green coun ...

  7. Nginx配置——区分PC或手机访问不同域名

    新官网上线,但在手机上访问新官网的体验很差,要求在手机上访问新官网时访问旧官网,可以通过修改Nginx配置来实现自动跳转.首先是新官网的Nginx配置文件加个跳转判断,通过user-agent判断来源 ...

  8. button disable and enable

    1. disable <button id="buttonId" disabled>......</button> $("#buttonId&qu ...

  9. Directory /home/hdfs/name is in an inconsistent state: storage directory does not exist or is not a

    2018-06-11 17:50:36,896 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered except ...

  10. Vuejs选项卡案例

    css .active { color: red; border-bottom: 1px solid red; } ul li { padding: 0 15px; float: left; list ...