[Algorithm] Reverse String II

Posted immjc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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. 链表反转。给定一个链表和一个数k

以上是关于[Algorithm] Reverse String II的主要内容,如果未能解决你的问题,请参考以下文章

[Algorithm] Reverse String II

[Algorithm] 234. Palindrome Linked List / Reverse linked list

reverse()函数的使用

leetcode-151-reverse word in a string

algorithm下的常用函数

reverse函数:反转容器内容