码迷,mamicode.com
首页 > 其他好文 > 详细

[Algorithm] Reverse String II

时间:2017-09-23 00:05:22      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:算法   code   部分   wap   空间   反转   char   需要   解法   

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

解法一:蛮力法

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

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

标签:算法   code   部分   wap   空间   反转   char   需要   解法   

原文地址:http://www.cnblogs.com/immjc/p/7577289.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!