对于某些非负整数 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
的一个字母异位词
解题
/**
* @param {string} s1
* @param {string} s2
* @return {number}
*/
var kSimilarity = function (s1, s2) {
let res = Number.MAX_SAFE_INTEGER;
const n = s1.length;
const swap = (arr, i, j) => {
const temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
};
const fn = (s1, s2, start, count) => {
if (count >= res) return res;
if (start === n - 1) return (res = count);
for (let i = start; i < n; i++) {
if (s1[i] !== s2[i]) {
for (let j = i + 1; j < n; j++) {
if (s2[j] === s1[i] && s2[j] !== s1[j]) {
swap(s2, i, j);
fn(s1, s2, i + 1, count + 1);
swap(s2, i, j);
if (s2[i] === s1[j]) break;
}
}
return res;
}
}
return (res = Math.min(count, res));
};
return fn(Array.from(s1), Array.from(s2), 0, 0);
};