解题思路:
根据C++代码的思路写的Python代码。
3个字母有6种排列方式。对于任意一种方式进行求解,然后取出最小值。例如BAT,先得出要放B的位置上有多少个数非B,然后这些位置是和后面的AT交换的,A要先和在A区间上的B交换,没有了就放到T的区间上,然后再是A和T交换。
A的非a部分是一定会交换到B和C上的(即ab,at)。
在A区的b(ab)和B区的a(ba)交换时,A区的b的个数不一定够(ab<ba),只能将A 区的t交换到B区,而这一部分(ba-ab)最后还要与B区的t一起到t区(bt+ba-ab),此时总次数。
A区的b(ab)和B区的a(ba)交换时,A区的b的个数够用甚至有余(ab>=ba),A区的b除了交换到B区,还会交换到T区,这一部分b(ab-ba)最终会被换成t,交换数量上是bt的一部分,所以交换的次数是bt。
所以最后每次循环交换的次数c=ab+at+bt +ba-min(ba,ab)。
参考代码:
s=list(input()) le=len(s) m=s[:] sl=['ABT','ATB','BAT','BTA','TAB','TBA'] ans=[] for i in range(6): c=0 s=m a,b,t=sl[i][0],sl[i][1],sl[i][2] an,bn=s.count(a),s.count(b) ab,at=s[0:an].count(b),s[0:an].count(t) ba,bt=s[an:an+bn].count(a),s[an:an+bn].count(t) c=ab+at+bt+ba-min(ba,ab) ans.append(c) print(min(ans))
0.0分
2 人评分
C语言程序设计教程(第三版)课后习题5.5 (C++代码)浏览:662 |
明明的随机数 (C++代码)浏览:867 |
The 3n + 1 problem (C语言代码)浏览:1378 |
点我有惊喜!你懂得!浏览:1564 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:909 |
字符串的输入输出处理 (C语言代码)浏览:1019 |
C语言训练-大、小写问题 (C语言代码)浏览:792 |
三角形 (C++代码)记忆化搜索浏览:1318 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:646 |
【蟠桃记】 (C语言代码)浏览:1084 |