[LintCode]53.翻转字符串

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

说明

  • 单词的构成:无空格字母构成一个单词
  • 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
  • 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
思路:先翻转整个字符串,再把每个单词翻转,就可以得到结果。
开始循环,遇到空格符直接跳过,如果是非空格,如果index不为0说明不是第一个单词,那么在他后面加个空格符。然后通过while循环找到下一个空格的位置。最后resize重置s的大小。

class Solution {
public:
    /*
     * @param s: A string
     * @return: A string
     */
    string reverseWords(string s) {
        reverse(s.begin(),s.end());
        int index = 0;
        for (int i = 0;i < s.size();i++) {
            if (s[i] != ' ') {
                if (index != 0) s[index++] = ' ';
                int j = i;
                while (j < s.size() && s[j] != ' ') s[index++] = s[j++];
                reverse(s.begin() + index - (j - i),s.begin() + index);
                i = j;
            } 
        }
        s.resize(index);
        return s;
    }  
};
在网上看到另一种方法:

string reverseWords(string s) {
        string word, line;
        int size=s.length();
        int i=size-1, begin=size-1, end=size-1;

        while(i >= 0) {
            while(s[i]==' ' && i>=0) {
                begin--;
                end--;
                i--;
            }
            while(s[i]!=' ' && i>=0) {
                begin--;
                i--;
            }
            word.resize(0);
            for(int j=begin+1; j<=end; j++){ 
                word.append(1, s[j]);
            }
            if(begin == 0)
                line = line + word;
            else
                line = line + word + " ";
            end = begin;
        }
        return line;
    } 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值