Skip to the content.

leetcode [854] 相似度为 K 的字符串


Contact me:

Blog -> https://cugtyt.github.io/blog/index
Email -> cugtyt@qq.com
GitHub -> Cugtyt@GitHub


如果可以通过将 A 中的两个小写字母精确地交换位置 K 次得到与 B 相等的字符串,我们称字符串 A 和 B 的相似度为 K(K 为非负整数)。

给定两个字母异位词 A 和 B ,返回 A 和 B 的相似度 K 的最小值。

示例 1:

输入:A = "ab", B = "ba"
输出:1

示例 2:

输入:A = "abc", B = "bca"
输出:2

示例 3:

输入:A = "abac", B = "baca"
输出:2

示例 4:

输入:A = "aabc", B = "abca"
输出:2

提示:

1 <= A.length == B.length <= 20
A 和 B 只包含集合 {'a', 'b', 'c', 'd', 'e', 'f'} 中的小写字母。

思路来自题解:

class Solution:
    def kSimilarity(self, A: str, B: str) -> int:
        if A == B:
            return 0

        memo = {('',''): 0}

        def core(A, B):
            if A == B: return 0
            if (A, B) in memo: return memo[(A, B)]
            
            start = 0
            while A[start] == B[start]:
                start += 1

            for i in range(start + 1, len(B)):
                if B[i] == A[start]:
                    next_a = A[start + 1:]
                    next_b = B[start + 1: i] + B[start] + B[i + 1:]
                    memo[(A, B)] = min(
                        memo.get((A, B), len(A)),
                        core(next_a, next_b) + 1
                    )
                
            return len(A) if (A, B) not in memo else memo[(A, B)]
            
        return core(A, B)