zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    .net 日期格式化
    grunt 上手
    设计模式的认识
    顺时针打印矩阵
    WCF 框架运行时类图
    Python闭包详解
    软件用了那些技术
    zoj 1610 Count the Colors(线段树延迟更新)
    快速提高自己的技术的办法?有两个方法
    纯win32实现PNG图片透明窗体
  • 原文地址:https://www.cnblogs.com/immjc/p/7577289.html
Copyright © 2011-2022 走看看