您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页字符串旋转

字符串旋转

来源:二三娱乐

下面描述两种算法
空间复杂度都为O(1)

解法一

暴力移位

#define len(a) (sizeof(a)/sizeof(*a))
#include <stdio.h>
#include <assert.h>
void leftShiftOne(char* string, int length);
void leftRotateString(char* string, int length, int num);
int main(void){
    char string[] = "asdfqwer";
    printf("%s\n", string);
    leftRotateString(string,len(string)-1,4);
    printf("%s\n", string);
}

void leftShiftOne(char* string, int length) {
    assert(string != NULL);
    char tmp = string[0];
    int i;
    for(i=1; i < length; i++) {
        string[i-1] = string[i];
    }
    string[length-1] = tmp;
}

void leftRotateString(char* string, int length, int num) {
    assert(num>=0);
    while(num--) {
        leftShiftOne(string,length);
    }
}

时间复杂度num*length
空间复杂度O(1)

解法二

三步反转法

它基于一个公式
X="abc"
X^T="cba"
(X^T YT)T=YX

#include <stdio.h>
#include <assert.h>
#define len(a) (sizeof(a)/sizeof(*a))
void reverseString(char* s, int from ,int to);
void leftRotateString(char *s, int length, int num);
int main(void){
    char s[] = "asdfqwer";
    printf("%s\n",s);
    leftRotateString(s, len(s)-1, 3);
    printf("%s\n",s);
    return 0;
}

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

void leftRotateString(char *s, int length, int num) {
    num = num%length;
    reverseString(s,0,num-1);
    reverseString(s,num,length-1);
    reverseString(s,0,length-1);
}

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务