Leetcode—151. 颠倒字符串中的单词

/*整体步骤:(先整体反转再局部反转:在原字符串上修改,用将满足要求的字符串覆盖原字符串)*/
//1反转链表,字符串中每个单词的位置已经颠倒过来了,
// 但单个单词中字符的顺序却改变了,之后要将每个单词位置调正;

//2三个指针,newdex:新字符串的下标;用start和end遍历每个单词:start指向每个单词的起始位置不    //动, 移动end指针去遍历;

//3找到第一个不为'  '的字符就是第一个单词的起始位置,然后用end遍历到这个单词尾部,再将整   //个单词颠倒;

/*注意事项:*/
//   ①注意要用新下标newdex去判断找到的start是不是第一个单词的起始位置,不是,要在覆盖动 //       作前,在新字符中插入一个'  ',保证每个单词间一个空字符!
//   ②注意循环覆盖动作的while循环条件:1、 end < n    2、s[end] != '  ' 
//   ③注意反转单个单词时迭代器的起始和终止位置
//   ④注意最后退出for循环时,要将原字符多余的部分删掉!

class Solution{
public:
     string reverseWords(string s) {
        /*反转整个字符串,使得每个单词整体的顺序满足要求*/
        reverse(s.begin(),s.end());
        int n = s.size();
        /*新字符串的下标*/
        int newdex = 0;
        for(int start = 0;start< n;start++){
            /*找到不为空的字符*/
            if(s[start] != ' '){
                /*判断找到的这个不为空的字符是第一个单词的吗?不是,在新字符串中插入个空格!是,就忽略*/
                if(newdex != 0)s[newdex++] =' ';
                /*用end去遍历整个单词*/
                int end = start;
                /*循环将原字符串的字符赋给新字符串*/
                while(end < n && s[end] != ' ')s[newdex++] = s[end++];
                /*将新字符串中的单词顺序正过来*/
                reverse(s.begin() + newdex - (end - start),s.begin() + newdex);
                /*更新start,去寻找下一个单词的位置*/
                start = end;
            }
        }
        /*将原字符串中多余的部分删掉,只留覆盖后新字符串的部分*/
        s.erase(s.begin() + newdex,s.end());
        return s;
     }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值