[Algorithm] Reverse String II

给定一个字符串,要求把字符串前面的若干字符移动到字符串尾部。

解法一:蛮力法

首先想考虑将一个字符移到尾部的方法。代码如下:

void LeftShiftOne(char* s, int n)
{
    char t = s[0];
    for (int i = 1; i != n; i++)
        s[i - 1] = s[i];
    s[n - 1] = t;
}

如果要移动m个字符串,则依次对函数LeftShiftOne执行m次即可。代码如下:

void LeftRotateString(char* s, int n, int m)
{
    while (m--) 
        LeftShiftOne(s, n);
}

时间复杂度:将一个字符移动到尾部需要n次操作,如果要移动m个字符,则需要操作m * n次。所以时间复杂度为O(m * n)

空间复杂度:O(1)

 

解法二:三步反转法

将一个字符串分为2个部分,一部分为m个需要旋转的字符记为X(abc),另一部分后半部分为n - m个字符记为Y(defg)。将X,Y反转。得到(cba)(gfed),之后将(cba)(gfed)整体反转得到(defgabc)。相当巧妙的算法。代码如下:

void ReverseString(char* s, int left, int right)
{
    while (left < right) 
        swap(s[left++], s[right--]);
}
void LeftRotateString(char* s, int n, int m)
{
    ReverseString(s, 0, m - 1);
    ReverseString(s, m, n - 1);
    ReverseString(s, 0, n - 1);
}

时间复杂度:每移动2个字符则要进行1次交换,所以时间复杂度正比与字符串的总数O(n)

空间复杂度:O(1)

 

举一反三

1. 链表反转:

2. 整数反转:[LeetCode] Rotate Array

3. 单词反转:[LeetCode] Reverse Words in a String

posted @ 2017-09-22 21:41  immjc  阅读(149)  评论(0编辑  收藏  举报