题目简介:
对于某些非负整数 k
,如果交换 s1
中两个字母的位置恰好 k
次,能够使结果字符串等于 s2
,则认为字符串 s1
和 s2
的 相似度为 k
。
给你两个字母异位词 s1
和 s2
,返回 s1
和 s2
的相似度 k
的最小值。
示例 1:
1 2
| 输入:s1 = "ab", s2 = "ba" 输出:1
|
提示:
1 <= s1.length <= 20
s2.length == s1.length
s1
和 s2
只包含集合 {'a', 'b', 'c', 'd', 'e', 'f'}
中的小写字母
s2
是 s1
的一个字母异位词
思路:
回溯,每次去交换s2
的两个字符,直到s1 == s2
。
tip:
- 当
now_count >= res
时,说明目前的交换路线必不是最优路线,直接舍去
- 当
s1[pos] == s2[pos]
时,说明无需交换,直接进行下一个位置的判断即可
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| class Solution { public:
int res = 10000000;
void Solve(string& s1, string& s2, int now_count, int pos){
if(now_count >= res) return; else if(s1 == s2){
res = now_count; return; }
if(s2[pos] == s1[pos]) Solve(s1, s2, now_count, pos + 1);
else{
for(int j = pos + 1; j < s2.size(); j++){
if(s2[j] == s1[pos]){
swap(s2[j], s2[pos]);
Solve(s1, s2, now_count + 1, pos + 1);
swap(s2[j], s2[pos]); } } }
}
int kSimilarity(string s1, string s2) {
Solve(s1, s2, 0, 0);
return res; } };
|