最少操作次数的简易版

 

            题目详情:

给定两个字符串,仅由小写字母组成,它们包含了相同字符。

求把第一个字符串变成第二个字符串的最小操作次数,且每次操作只能对第一个字符串中的某个字符移动到此字符串中的开头。

例如给定两个字符串“abcd" "bcad" ,输出:2,因为需要操作2次才能把"abcd"变成“bcad" ,方法是:abcd->cabd->bcad。

算法思路:从目标字符串的尾部开始,设当前字符a,前一个字符为b,a在原始序列中的位置是src,则如果在原始序列中src之前含有b,则跳过,查看a前一个字符;否则从原始序列的尾部开始查找b,找到之后进行一次操作;再同样操作对a的前一个字符,直到达到目标字符串的首部。
#include<stdio.h>
//按from到to的方向在字符串内查找字符c
const char*find(const char*from,const char*to,char c){
    int dirct=from-to>=0?-1:1;//方向
    while(from!=to)
    if(*from==c)
    return from;
    else
    from+=dirct;
    return *to==c?to:NULL;
}
//pa-end之间的字符串进行一次操作
void operate(char*pa,char*end){
    char c;
    c=*end;
    while(--end>=pa)
        end[1]=end[0];
    *pa=c;
}

int getNumber (char* a,char* b)
{
    int num=0;
    char *enda,*endb,*tmp,*target,*src;
    enda=a;endb=b;
    while(*enda)++enda;
    while(*endb)++endb;
    enda--;
    endb--;
    target=endb;
    src=find(enda,a,*target);
    while(target>b){
        if(src==a)
           tmp=NULL;
        else
           tmp=find(src-1,a,*(target-1));//在src的左侧查找target前一个字符
         if(tmp!=NULL){//在左边找到
              src=tmp;
            target--;
        }else{//左边没找到,则必定在右边
              num++;
            tmp=find(enda,src+1,*(target-1));
            operate(a,tmp);//将找到的字符变换到首部
              src=a;
            target--;
            //printf("a:%s\nsrc=0,target=%d\n",a,target-b);
        }
    }
    return num;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{   
    printf("%d",getNumber("122121","212112"));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值