题目描述
如果可以通过将 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
思路
广搜:我们尽量先把前面的字符串换成相等的,每次从后面去找字符换过来
也可以用深搜+贪心的思路
实现
int kSimilarity(string A, string B) {
queue<string>que;
que.push(A);
int level = 0,cur=0;
unordered_map<string, bool>visited;
while (!que.empty())
{
int num = que.size();
while (num--)
{
auto top = que.front();
if (top == B)
return level;
que.pop();
int i, j;
for (i = cur; i < top.size() && top[i] == B[i]; i++);
j = i + 1;
for (; j < top.size(); j++)
if (top[j] == B[i])
{
swap(top[i], top[j]);
if (!visited[top])
{
que.push(top);
visited[top] = true;
}
swap(top[i], top[j]);
}
}
level++;
cur++;
}
return 0;
}