首页 > 代码库 > 左旋字符串

左旋字符串

定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。 请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。

编程之美上有这样一个类似的问题,咱们先来看一下

设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N), 且只允许使用两个附加变量

我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次。 abcd1234→4abcd123→34abcd12→234abcd1→1234abcd

#include <stdio.h>

#include <stdlib.h>


void RightShift(char* arr,int N,int K)

{

    K%=N;

    while(K--)

    {

        char t=arr[N-1];

        int i;

        for(i=N-1;i>0;i--)

            arr[i] = arr[i-1];

        arr[0]=t;


    }


}

int main()

{

    //printf("Hello world!\n");

   char arr[]="buaa123";

    printf("the size of arr is %d.\n",sizeof(arr));

    printf("the length of arr is %d.\n",strlen(arr));


  RightShift(arr,strlen(arr),1);


    printf("the arr is %s.\n",arr);


    char s[]="ustb123";//char *s=????????????

    printf("the size of array s is %d.\n",sizeof(s));

    printf("the length of s is %d.\n",strlen(s));


    RightShift(s,strlen(s),1);


    printf("the array s is %s.\n",s);



    return 0;

}

虽然这个算法可以实现数组的循环右移,但是算法复杂度为O(K * N),