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'} 中的小写字母。
思路来自题解:
- 找到第一个不相等的位置,记为start位置
- 在第二个字符串找和第一个字符串start位置相等的字符,如果找到,假设交换深度遍历,继续寻找下一个相等的位置,并用字典记录交换值。
- 找完之后,返回记录中最小的那个。
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)