字符串翻转

字符串翻转

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

//解法一:蛮力移位
//时间复杂度为O(mn),空间复杂度O(1)
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);
     }
}

既然题目要求将字符串前面的那部分原封不动地移到字符串的尾部,那么是否可以把需要移动的部分跟不需要移动的部分分开处理呢?
例如:可以先将一个字符串分割成两个部分,然后将这两个部分的字符串分别反转,最后再对整个字符串进行整体反转,即可解决字符串旋转的问题

拿题目中的例子来说,给定字符串“abcdef”,若要将“def”移动到“abc”前面,只需要按照下面3个步骤操作即可

  1. 将原串分为X和Y两个部分,其中X为“abc”,Y为“def”
  2. 将X的所有字符反转,即相当于反转“abc”得到“cba”;再将Y的所有字符也反转,即相当于反转“def”得到“fed”将X的所有字符反转,即相当于反转“abc”得到“cba”;再将Y的所有字符也反转,即相当于反转“def”得到“fed”
  3. 最后,将上述步骤得到的结果再给予整体反转,即整体反转“cbafed”得到“defadc”,这样,就实现了字符串的反转最后,将上述步骤得到的结果再给予整体反转,即整体反转“cbafed”得到“defadc”,这样,就实现了字符串的反转
//解法二:三步反转
//时间复杂度O(n),空间复杂度O(1)
void ReverseString(char* s, int start, int end)
{
     while (start < end)
     {
           char t = s[start];
           s[start++] = s[end];
           s[end--] = t;
     }
}
void LeftRotateString(char* s, int n, int m)
{
     //若要左移动大于n位,那么与%n是等价的
     m %= n;
     ReverseString(s, 0, m - 1);
     ReverseString(s, m, n - 1);
     ReverseString(s, 0, n - 1);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值