`
xidajiancun
  • 浏览: 454500 次
文章分类
社区版块
存档分类
最新评论

最小操作次数的简易版【解】--英雄会

 
阅读更多

给定两个字符串,仅由小写字母组成,它们包含了相同字符。 求把第一个字符串变成第二个字符串的最小操作次数,且每次操作只能对第一个字符串中的某个字符移动到此字符串中的开头。

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

说起来也是有点意外,这一题前两天看了一下,当时感觉有点复杂,就暂时先放下了,昨晚浏览的时候顺便又看了一下,一看是两星难度的(有点欺软怕硬,不过结合难度来不同考虑感觉是有必要的),就把题目记下了,不过当时已经两点了...就赶快上床了,有些睡不着,这题的思路就自己蹦出来了(幸运o(∩_∩)o 哈哈),当时记下了,准备今天早上试试。

比较幸运,早上接着昨晚的思路来,感觉没多大问题,交了一下,竟然有点问题...当时被打击了,后来发现计算字符串大小的时候是用sizeof(a)的,汗啊...

下面说说思想吧,题目的要求是将每个字符移动到字符串的开头,所以最先移动的就慢慢靠后了,当时的思想是由后面向前匹配,由target最后一个字符在source的最后一个字符开始匹配,若匹配上了,target,source继续向前匹配,若是没有匹配成功,则在source继续向前匹配,直到找到为止,下次的匹配由此点开始。

ps:a是source,b是target

在if(b[i] == a[j])中,刚开始丢了个j--;因为此时已经匹配了,所以source[j](即a[j])下次不能使用,但是在英雄会里通过了,可能是测试点太少了,不过是不可以缺少的。

可以拿字符串"tacdeTst"以及"Teasdctt"试试;

if(b[i] == a[j])  //匹配到,计数+1,继续向前匹配
     {
          j--;
          count++;
     }

通过将j--;注释,即可得到效果;

没有模拟它的移动过程,有点取巧,但是不失是个好方法

好的,代码贴上:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int getNumber (char* a,char* b)
{
    int n = strlen(a);  //字符串长度

    int count = 0;
    int i;
    int j = n - 1;  //由后向前匹配
    for(i = n - 1; i >= 0; i--)
    {
        if(b[i] == a[j])  //匹配到,计数+1,继续向前匹配
        {
            j--;
            count++;
        }

        else
        {
            for(j--; j >= 0; j--)  //匹配,直到找到为止
            {
                if(b[i] == a[j])
                {
                    count++;
                    break;
                }
            }
        }

        if(j < 0)  //匹配结束
            break;
    }

    return n - count;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
    printf("%d\n",getNumber("tacdeTst","Teasdctt"));
    system("pause");
    return 0;
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。

测试用例:

结果:

有什么不清楚各位说说...

大神们有什么建议,可以提点一下...多多交流,3Q.......o(∩_∩)o 哈哈

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics