相似度为 K 的字符串

40 阅读1分钟

854. 相似度为 K 的字符串 - 力扣(LeetCode)

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

给你两个字母异位词 s1s2 ,返回 s1s2 的相似度 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'} 中的小写字母
  • s2s1 的一个字母异位词

解题

/**
 * @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);
};