【剑指offer系列】 翻转单词 VS 左旋字符串___42

  题目描述:
  输入一个英文句子,翻转句子中的单词的顺序
  
  示例:
  输入: “the sky is blue”
  输出:”blue is sky the”
  
  分析:
  可以翻转整个句子,然后翻转其中的每个单词。
  同时考虑去掉句子中多余的空格(句子首尾不能有空格,单词间只能有一个空格)  (leetcode 151)
  
  代码:   

    void myswap(string& s,int start,int end){
        for(int i=start,j=end;i<j;++i,--j){
            swap(s[i],s[j]);
        }
    }
    void removeDuplicateSpace(string& s,vector<int>& index){
        string ret;
        int i=0;
        int j=s.size()-1;
        int cnt=0;
        while(i<=j&&s[i]==' ')   ++i;
        while(i<=j&&s[j]==' ')   --j;
        while(i<=j){
            if(s[i]==' '){
                ++cnt;
                if(cnt==1){
                    index.push_back(ret.size());
                    ret+=s[i];
                }  
            }else{
                ret+=s[i];
                cnt=0;
            }
            ++i;
        }
        s=ret;
    }
    void reverseWords(string &s) {
        vector<int> index;
        myswap(s,0,s.size()-1);    //翻转整个句子
        index.push_back(-1);
        removeDuplicateSpace(s,index);  //去掉多余空格,并将空格的下标放入index数组中
        index.push_back(s.size());
        for(int i=0;i<index.size()-1;++i){
            myswap(s,index[i]+1,index[i+1]-1);  //翻转每个单词
        }

    }   


  左旋字符串采用同样的方法,首先翻转整个字符串,然后分别翻转两段字符串。  

reverse(0,str.size()-1);
reverse(0,k);
reverse(k+1,str.size()-1);

你可能感兴趣的:(【剑指offer系列】 翻转单词 VS 左旋字符串___42)