左旋转字符串以及扩展

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nwpubear/article/details/81748606

翻转字符串

翻转一个字符串中的单词顺序,只需要
1. 翻转字符串
2. 翻转单词

class Solution {//左旋转某个有序的东西,只需要先反转整体,让内部元素整体归位,然后在局部反转,让内部元素的每个元素归位
public:
    string ReverseSentence(string str) {
        int begin=0;
        int end=0;
        int len=str.size();
        //反转整个句子
        ReverseWord(str,0,str.size()-1);
        //反转其中的单个单词
        //每个单词之间都是空格隔开
        begin=0;
        end=0;
        //没有遇到单词的时候两个指针一起运动
        //核心是一个指向单词头部,一个遍历单词直到遇到空白或者句子的末尾,
        while(end<=len-1){
            if(str[begin]==' '){    //首先找到不是单词的头部
                begin++;
                end++;
            }
            else if(str[end]==' '){     //遇到了一个单词的末尾
                ReverseWord(str,begin,end-1);
                begin=end;
            }
            else if(end==len-1){        //到了句子的末尾
                ReverseWord(str,begin,end);
                break;
            }
            else{                   //在单词上面
                end++;
            }
        }
        return str;
    }
private:
    static void ReverseWord(string & str,int begin,int end){
        reverse(str.begin()+begin,str.begin()+end+1);
    }
};

左旋转字符串

其实左旋转只是这个的一个扩展,把前半部分看成一个局部整体,后半部分看成局部整体
1. 翻转字符串
2. 翻转两个局部

class Solution {    //左旋转字符串,需要注意求余数的时候先考虑长度为0,避免出现数学错误
public:
    string LeftRotateString(string str, int n) {
        if(str.size()==0 || (n=n%str.size())==0)
            return str;
        reverse(str.begin(),str.end());
        reverse(str.begin(),str.end()-n);
        reverse(str.end()-n,str.end());     
        return str;     
    }
 };  

猜你喜欢

转载自blog.csdn.net/nwpubear/article/details/81748606