题目描述:
如果可以通过将 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’} 中的小写字母。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/k-similar-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我一开始比较懵逼,感觉这道题应该很难,但是看人家说用BFS可以通过就自己尝试写了一下,通过了
class Solution {
public int kSimilarity(String A, String B) {
if(A.equals(B)){
return 0;
}
Queue<String> queue = new LinkedList<>();
queue.offer(A);
int result = 0;
while (!queue.isEmpty()){
int size = queue.size();
for (int i = 0; i < size; i++) {
String tem = queue.poll();
int getfirst = getfirst(tem,B);
if(getfirst == B.length()){
return result;
}
List<Integer> find = find(getfirst + 1,B.charAt(getfirst),tem,B);
for (Integer integer : find) {
char [] chars = tem.toCharArray();
change(getfirst,integer,chars);
queue.offer(new String(chars));
}
}
result ++;
}
return result;
}
public int getfirst(String A,String B){
for (int i = 0; i < A.length(); i++) {
if(A.charAt(i) != B.charAt(i)){
return i;
}
}
return A.length();
}
// A:abc B bca 那么abc 首先会找到下标1的b然后交换
public List<Integer> find(int index,char tart,String s1,String s2){
List<Integer> list = new ArrayList<>();
for (int i = index; i < s1.length(); i++) {
if(s1.charAt(i) == tart && s2.charAt(i) != tart){
list.add(i);
}
}
return list;
}
public void change(int i, int j,char []tem){
char s = tem[i];
tem[i] = tem[j];
tem[j] = s;
}
}