字符串移动(字符串为*号和26个字母的任意组合,把*号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小

博客讨论了一个字符串处理问题,其中*号需移动到最左侧,字母移到最右侧且保持相对顺序不变。提出了一种解决方案,包括查找*号位置、两次旋转字符串,适用于多个*号的情况。博主邀请读者对时间复杂度进行思考和讨论。
摘要由CSDN通过智能技术生成

这是在原有字符串旋转的基础上进行的,比如说给定字符串的组合是:abcdef*hijkl;首先看怎么解决这个问题,然后在给出程序代码。

1,找到*的位置,这很简单,在o(n)时间内就可以找到,记为pos。

2,对*(包括*)之前的字符串进行旋转,结果为*fedcba

3,从*后的字符开始进行再次的旋转,结果为*abcdef加上原来的字符串,那么就是*abcdefhijkl。

从中可以看到,*移动了最左边,字母移动到*号后的相对位置没有更改,同时,可以用这种方法解决有多个*号的情况。但是如果是这个的移动的话或许在时间复杂度方面有缺陷,希望大家看后能够给出一些自己的想法,共同讨论,多谢。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void swap(char *begin,char *end)
{
        char temp;
        while(begin<end)
        {
                temp=*begin;
                *begin=*end;
                *end=temp;
                begin++;
                end--;
        }
}
void move_string(char *str,int k,int len)
{//k is the position of * in string
        swap(str,str+k);
        swap(str+1,str+k);
}
in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值