翻转字符串

描述:给定一个字符串,逐个翻转字符串中的每个单词。
说明
单词的构成:无空格字母构成一个单词
输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
样例:
Given s = “the sky is blue”,
return “blue is sky the”.
思路:先反转整个字符串,然后再反转字串。譬如先将“I am a student”反转为“tneduts a ma I”,然后再对每个字串(空格分割)反转一次。
新知识点:string t(s)//新建一个字符串t与已存在的s结构、参数完全一致;
p.find_first_not_of(” “)//返回字符串p第一个不是空格的字符的序号
p.find_last_not_of(” “)//返回字符串p最后一个不是空格的字符的序号
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)

class Solution {
public:
    /**
     * @param s : A string
     * @return : A string
     */
    string reverseWords(string s) {
               // write your code here
        int len=s.size(),i,cnt=0,k=0,pos=0,cd;
        /*创建两个字符串:t用来存放整体翻转后的字符串;p用来存放每个单词都翻转后的字符串*/
        string t(s);
        string p(s);
        /*翻转整个字符串*/
        for(i=0; i<len; i++){
            t[i]=s[len-1-i];
        }
        /*翻转每个单词*/
        for(i=0; i<len; i++)
        {
            /*依次翻转除最后一个单词之外的所有单词*/
            if(t[i] == ' ')//每次检测到空格,表示一个完整的单词
            {
                cd=i-pos;//计算待翻转的单词的长度,存入cd
                /*翻转单词*/
                for(k=0; k<cd; k++) 
                    p[cnt++]=t[i-k-1];

                pos=i+1;//pos记下翻转后的单词的结尾的序号,之所以加1,是因为cd=i-pos中的i是每次检测到新单词的最后的空格的序号,而pos=i+1中的i是前一个单词的空格的序号,所以为了计算下一个待翻转的单词(即新单词)的长度,pos也得加1,使pos存放的是新单词第一个字符的序号。
                p[cnt++]=' ';//翻转完毕后,将单词后面一个字符置为空格
            }
            /*翻转最后一个单词*/
            if( i == (len-1))//因为最后一个单词后面没有空格,只有通过判断计数是否到达了(长度-1),若到达了,则表示最后一个单词完整了
            {
                cd=i-pos+1;//计算最后一个单词的长度,之所以加1,因为pos此时存放的是最后一个单词的第一个字符的序号,而此时的i存放的是len-1,即最后一个单词的最后一个字符的序号,i-pos表示的是最后一个单词的长度减1.
                /*翻转最后一个单词*/
                for(k=0; k<cd; k++,cnt++)   
                    p[cnt]=t[i-k];
            }
        }
        /*去掉字符串前后多余的空格*/
        p.erase(0,p.find_first_not_of(" "));  
        p.erase(p.find_last_not_of(" ") + 1);  

        return p;
    }
};

以上是自己编写的结果 ,后面参考网上,找到更优的解决算法。
思路:每个单词逐次翻转并同时存入新的字符串中。先将单词存入temp中,此时单词已经翻转,然后将temp中的字符串再进行翻转,恢复原状并写入新字符串ss中。
新知识点:s.length()//表示字符串s的长度
ss.push_back(’ ‘)//表示在字符串ss后加上一个字符,此处为空格
ss.append(temp)//表示在字符串ss后加上一个字符串,此处为字符串temp

 string reverseWords(string s) {
        // write your code here
     string ss;
        int i = s.length()-1;//此时i表示的字符串最后一个字符所在的序号
        while(i>=0)
        {
            while(i>=0&&s[i] == ' ')//解决了首末字符为空格的情况,另外也去掉了两个单词之间的空格
            {
                i --;
            }
            if(i<0) break;//所有单词翻转结束,退出循环
            if(ss.length()!=0)//当翻转一个单词结束后,在后面加上一个空格
                ss.push_back(' ');
            string temp ;//
            for(;i>=0&&s[i]!=' ';i--)//将单词暂存至temp,此时单词是翻转后的状态
                temp.push_back(s[i]);
            reverse(temp.begin(),temp.end());//进行单词翻转,恢复原状
            ss.append(temp);//将翻转后的单词存入字符串ss中
        }
        s=ss;
        return s;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值