leetcode--字符串循环左移

// convert_test.cpp : 定义控制台应用程序的入口点。
//字符串循环左移问题

#include "stdafx.h"
#include
using namespace std;

//   问题:给定一个字符串S[0...N-1],要求把S的前K个字符移动到S的尾部,比如字符串"abcdef",
//前面两个字符 'a' 'b'移动到字符串的尾部,得到新字符串"cdefab",即字符串循环左移K。
//注:循环左移k位和循环右移n-k位效果一致。
//要求:时间复杂度O(n),空间复杂度O(1).


void ReverseString(char* s, int from, int to)
{
    while (from < to)
    {
        char t = s[from];
        s[from++] = s[to];
        s[to--] = t;
    }
}

void LeftRotateString(char* s, int n, int m)
{   //n为字符串长度,m为循环左移个数
    m %= n; //注:循环左移n+k位和k位的效果相同,因为比如一个字符串长度为6,循环左移8位,结果和循环左移2位一致
    ReverseString(s, 0, m - 1); //第一次copy,S[0...k]--T[0...k]
    ReverseString(s, m, n - 1);//第二次copy,S[k+1...N-1]--S[0...N-k-1]
    ReverseString(s, 0, n - 1);//第三次copy,T[0...k]--S[N-k...N]

}

int _tmain(int argc, _TCHAR* argv[])
{
    //顺便解释main中两个行参的意思,argc=argument count,argv=argumen value。
    //char* argv[]是一个指针数组,这个数组的元素都是指针,argv[0]表示指向一个元素,*argv[0]表示取第一个元素。
    //作用是命令行参数,例如命令行为 copy frompath to,由三个字符串组成,则int argv=3,* argv[0]代表"copy"这个字符串

    char* s= "abcdef";
    int n = 6;
    int m = 2;
    LeftRotateString(s, n, m);
    return 0;
}

你可能感兴趣的:(leetcode)