字符串的旋转--3步翻转法

问题描述

给定一个字符串,要求将字符串前面的若干字符移到字符串的尾部。例如:
将字符串“abcdef”的前3个字符’a’、’b’和’c’移到字符串的尾部,那么原字
符串将变成“defabc”,请写一个函数实现此功能.

思路:可通过三步翻转的方法实现

  • step1:将原字符串分成两部分,一部分是字符串前面的“若干字符”X,另一部分是除了X的Y;
  • step2:将X的所有字符翻转,即上面所说的,将”abc”翻转成”cba”,将”def”翻转成”fed”;
  • step3:将整个字符串全部翻转–即将”cbafed”翻转成”defabc”。即实现了字符串前面若干字符移动到尾部。

时间复杂度为O(n)

代码如下:

代码一

/**********************
解题思路--- n步反转
step1:首先一空格为拆分,将字符串分为k个部分(向后取空格的原则);
step2:分别对这k个部分的子串进行反转
step3:最后对字符串整体反转

Author:tmw
date:2018-3-17
***********************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define swap(x,y,t) (t=x,x=y,y=t)

void reverseString( char* str, int front, int end )
{
    char temp;
    while( front<end )
    {
        swap(str[front],str[end],temp);
        front++;end--;
    }
}


void three_steps_reverse( char* str )
{
    int i = 0;
    int j = 0;
    int mark_left,mark_right;
    while( i<strlen(str) )
    {
        while( i<strlen(str)&&str[i]!=' ' )
            i++;

        /**i此时指向空格,这里将坐标回移**/
        i--;

        /**保护i、j的游标不被改动**/
        mark_left = j;
        mark_right = i;

        reverseString(str,mark_left,mark_right);
        printf("%s\n",str);
        j = i + 2; //j指向下一个单词的开头位置
        i = j;
    }
    /**最后整体翻转**/
    reverseString(str,0,strlen(str)-1);
}

这里写图片描述

代码二

/************************
Author:tmw
date:2017-11-29
************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define swap(x,y,t) (t=x,x=y,y=t)
void rotate(char* array , int low , int high )
{
    int temp;
    while(low<high)
    {
        swap(array[low],array[high],temp);
        low++;
        high--;
    }
}
void three_steps_rotate(char* array , int rotate_part , int array_len )
{
    rotate(array,0,rotate_part-1);
    rotate(array,rotate_part,array_len-1);
    rotate(array,0,array_len-1);
}

测试代码:

int main()
{
    printf("测试代码!\n");
    char a1[] = "abcdefghigk";
    printf("原字符串为:%s\n",a1);
    three_steps_rotate(a1,3,strlen(a1));
    printf("旋转后的字符串为:%s\n",a1);

    char a2[] = "zhongkeyuanjisuansuo";
    printf("原字符串为:%s\n",a2);
    three_steps_rotate(a2,4,strlen(a2));
    printf("旋转后的字符串为:%s\n",a2);

    return 0;
}

测试结果:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值