最小操作次数的简易版【解】--英雄会
2013-12-21 12:53
197 查看
给定两个字符串,仅由小写字母组成,它们包含了相同字符。 求把第一个字符串变成第二个字符串的最小操作次数,且每次操作只能对第一个字符串中的某个字符移动到此字符串中的开头。
例如给定两个字符串“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"试试;
通过将j--;注释,即可得到效果;
没有模拟它的移动过程,有点取巧,但是不失是个好方法。
好的,代码贴上:
测试用例:
![](http://img.blog.csdn.net/20131221124638656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGptMTk5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
结果:
![](http://img.blog.csdn.net/20131221124727046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGptMTk5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
有什么不清楚各位说说...
大神们有什么建议,可以提点一下...多多交流,3Q.......o(∩_∩)o 哈哈
例如给定两个字符串“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 哈哈
相关文章推荐
- pongo(英雄会)题解之最少操作次数的简易版
- 【Codeforces Round 336 (Div 2) D】【区间DP 讨论 好题】Zuma 区间取回文串最小操作次数使得取光全串
- 英雄会 高校俱乐部 最少操作次数
- 最少操作次数的简易版
- 最少操作次数的简易版
- 【GoogleCodeJam2016B】【贪心】Revenge of the Pancakes -+改变并翻转 最小操作次数使得字符串变为全+
- 最少操作次数的简易版
- 最少操作次数的简易版
- 51nod oj 1183 编辑距离 【求一个字符串到另一个字符串的最小操作次数【类似LCS】】
- 字符串的相似度-最小操作次数(转载…
- 把一个单词增删改一个字符变为另外一个单词的最小操作次数
- C++ 简易string类实现(四)-自动操作引用次数
- NEU1511 Caoshen like math(使序列有序的最小交换次数)
- 求数组中最大值和最小值 以及 求数组中最大值和次大值 最小比较次数
- 对一个正整数n,算得到1需要的最少操作次数。
- 计算memcache中搜索次数并加以操作
- Minitab软件是现代质量管理统计的领先者,全球六西格玛实施的共同语言,以无可比拟的强大功能和简易的可视化操作深受广大质量学者和统计专家的青睐。
- Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)
- 计算最少操作次数。。。
- Map实现从0~100中随机生成50个数,统计出现的数字最大值和最小值,输出出现最多的次数及对应的数字