经典算法——左旋转字符串

一、题目描述

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

二、解题思路
经典的三次翻转:
1.先翻转字符串前n个字符;
2.再翻转后面的字符;
3.翻转整个字符串;

比如:输入字符串s="12345abc",n=5;首先翻转前5个字符变成54321abc,然后翻转后面的字符变成54321cba,最后翻转整个字符串变成abc12345


经典算法——左旋转字符串_第1张图片

class Solution {
public:
	string LeftRotateString(string str, int n) {
		if (str.empty() || n>str.length())  return str;

        char *pData = const_cast<char*>(str.data());
        if (str.length() > 0 && n > 0 && n < str.length())
        {
            char* pBegin = pData + 0;
            char* pEnd = pData + n - 1;
            char* pBegin2 = pData + n;
            char* pEnd2 = pData + str.length() - 1;

            reverse(pBegin, pEnd);//翻转字符串前面n个字符
            reverse(pBegin2, pEnd2);//翻转字符串的后面部分
            reverse(pBegin, pEnd2);//翻转整个字符串
        }
		return str;
	}
    
    void reverse(char* pBegin, char* pEnd)
	{
		if (pBegin == NULL || pEnd == NULL)  return;
		while (pBegin<pEnd)
		{
			char temp = *pBegin;
			*pBegin = *pEnd;
			*pEnd = temp;
			pBegin++;
			pEnd--;
		}
	}
};



你可能感兴趣的:(经典算法——左旋转字符串)