解题思路:
这个题可以暴力求解,但是细微观察一下,题目是有规律可循的:
(下面说说的翻转都是指依次翻转两个相邻的位置,同题目中的意思)
就用例子来说吧:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
* | * | * | o | * | * | * | o | * | * |
* | o | * | * | * | o | * | * | * | * |
(用表格更容易看对其效果)
对于这两个链:只需要翻转4次就可以使两个链相同(只看出的),那么规律就是每两个相邻的不同位置的下标之差的和就是所求的最小次数(注意我说的是每两个相邻的位置,也就是每一个不同的位置只能用一次)。对于上述两个链计算过程就是(橙色)3-1 = 2,(蓝色)7 - 5 = 2;那么结果就是2 + 2 = 4;
在比如:
0 | 1 | 2 | 3 | 4 | 5 |
* | * | * | * | * | * |
o | * | * | * | * | o |
这两个链需要翻转的最少次数为:5 - 0 = 5;即5次;
上面两个例子,大家应该都可以看出了吧;
或许有人想到了这个例子:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
* | * | * | * | * | * | o | * | * | * |
* | o | * | * | * | * | * | * | * | o |
对于这两个链上面的规律就“失效了”,但是大家仔细观察,这种情况应该是无解的,所以上面总结的规律是正确的。
注意事项:
注意的我的代码中,如何来算每相邻不同位置的差的总和的,也就是start的妙用。
参考代码:
#include <iostream> #include <string> using namespace std; int main() { string str1, str2; cin >> str1 >> str2; int start = 0, cnt = 0; for(int i = 0; i < str1.size(); ++i) { if(str1[i] != str2[i]) { if(start) { cnt += (i - start); start = 0; } else { start = i; } } } cout << cnt << endl; return 0; }
0.0分
44 人评分
C语言程序设计教程(第三版)课后习题5.4 (C++代码)浏览:859 |
C二级辅导-进制转换 (C语言代码)浏览:849 |
C二级辅导-求偶数和 (C语言代码)浏览:664 |
简单的a+b (C语言代码)浏览:689 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:698 |
简单的a+b (C语言代码)浏览:641 |
printf基础练习2 (有点不明白)浏览:887 |
C语言训练-尼科彻斯定理 (C语言代码)浏览:509 |
【偶数求和】 (C语言代码)浏览:588 |
WU-拆分位数 (C++代码)浏览:819 |