854. 相似度为 K 的字符串
对于某些非负整数 k ,如果交换 s1 中两个字母的位置恰好 k 次,能够使结果字符串等于 s2 ,则认为字符串 s1 和 s2 的 相似度为 k 。
给你两个字母异位词 s1 和 s2 ,返回 s1 和 s2 的相似度 k 的最小值。
示例 1:
输入:s1 = “ab”, s2 = “ba”
输出:1
示例 2:
输入:s1 = “abc”, s2 = “bca”
输出:2
提示:
1 <= s1.length <= 20
s2.length == s1.length
s1 和 s2 只包含集合 {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’} 中的小写字母
s2 是 s1 的一个字母异位词
思路:可以用深搜回溯暴力递归,具体就是比较两个字串的每个位置,一旦发现某个位置不一样就开启深搜交换,找到一样的位置进行交换,然后再进入下一层比较下一个位置,一旦发现当前交换次数已经比之前的最小交换次数大,就剪枝,抛弃当前搜索路径,直到最后无法再交换,然后回溯,返回值是比较后较小的交换次数
class Solution {
int result = Integer.MAX_VALUE;
public int kSimilarity(String s1, String s2) {
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
return dfs(c1, c2, 0, 0);
}
public int dfs(char[] c1, char[] c2, int start, int current){
if(current > result)
return result;
if(start == c1.length - 1){
return result = Math.min(result, current);
}
for(int i = start; i < c1.length; i++){
if(c1[i] != c2[i]){
for(int j = i+1; j < c2.length; j++){
if(c1[i] == c2[j]){
char temp = c2[i];
c2[i] = c2[j];
c2[j] = temp;
dfs(c1, c2, i+1, current + 1);
// 回溯
temp = c2[i];
c2[i] = c2[j];
c2[j] = temp;
}
}
return result;
}
}
return result = Math.min(result, current);
}
}
参考:爪哇缪斯