854. 相似度为 K 的字符串
如果可以通过将 A 中的两个小写字母精确地交换位置 K 次得到与 B 相等的字符串,我们称字符串 A 和 B 的相似度为 K(K 为非负整数)。
给定两个字母异位词 A 和 B ,返回 A 和 B 的相似度 K 的最小值。
示例 1:
输入:A = "ab", B = "ba"
输出:1
示例 2:
输入:A = "abc", B = "bca"
输出:2
提示:
1 <= A.length == B.length <= 20
A 和 B 只包含集合 {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’} 中的小写字母。
方法1. BFS
class Solution {
public int kSimilarity(String A, String B) {
Queue<String> queue = new ArrayDeque();
queue.offer(A);
Map<String, Integer> dist = new HashMap();
dist.put(A, 0);
while (!queue.isEmpty()) {
String S = queue.poll();
if (S.equals(B)) return dist.get(S);
for (String T: neighbors(S, B)) {
if (!dist.containsKey(T)) {
dist.put(T, dist.get(S) + 1);
queue.offer(T);
}
}
}
throw null;
}
public List<String> neighbors(String S, String target) {
List<String> ans = new ArrayList();
int i = 0;
for (; i < S.length(); ++i) {
if (S.charAt(i) != target.charAt(i)) break;
}
char[] T = S.toCharArray();
for (int j = i+1; j < S.length(); ++j)
if (S.charAt(j) == target.charAt(i)) {
swap(T, i, j);
ans.add(new String(T));
swap(T, i, j);
}
return ans;
}
public void swap(char[] T, int i, int j) {
char tmp = T[i];
T[i] = T[j];
T[j] = tmp;
}
}
方法2.dp