翻转字符串

来源:互联网 发布:网络订购白兰地 编辑:程序博客网 时间:2024/06/07 10:21

描述:给定一个字符串,逐个翻转字符串中的每个单词。
说明
单词的构成:无空格字母构成一个单词
输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
样例:
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;    }