Keshawn_lu's Blog

Leetcode 854. 相似度为 K 的字符串

字数统计: 330阅读时长: 1 min
2022/09/21 Share

题目简介:

对于某些非负整数 k ,如果交换 s1 中两个字母的位置恰好 k 次,能够使结果字符串等于 s2 ,则认为字符串 s1s2相似度为 k

给你两个字母异位词 s1s2 ,返回 s1s2 的相似度 k 的最小值。

示例 1:

1
2
输入:s1 = "ab", s2 = "ba"
输出:1

提示:

  • 1 <= s1.length <= 20
  • s2.length == s1.length
  • s1s2 只包含集合 {'a', 'b', 'c', 'd', 'e', 'f'} 中的小写字母
  • s2s1 的一个字母异位词

思路:

回溯,每次去交换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;
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: