Strings s1
and s2
are k
-similar (for some non-negative integer k
) if we can swap the positions of two letters in s1
exactly k
times so that the resulting string equals s2
.
Given two anagrams s1
and s2
, return the smallest k
for which s1
and s2
are k
-similar.
Example 1:
Input: s1 = "ab", s2 = "ba" Output: 1
Example 2:
Input: s1 = "abc", s2 = "bca" Output: 2
Constraints:
1 <= s1.length <= 20
s2.length == s1.length
s1
ands2
contain only lowercase letters from the set{'a', 'b', 'c', 'd', 'e', 'f'}
.s2
is an anagram ofs1
.
思路:就是BFS,每个level去搜,比较两个string,找到第一个不同的,ab, ba,第一个a必须换成b,那么就在s1里面找所有的b,然后生成下一层的string,记得swap回来;
class Solution {
public int kSimilarity(String s1, String s2) {
Queue<String> queue = new LinkedList<>();
queue.offer(s1);
int step = 0;
HashSet<String> visited = new HashSet<>();
while(!queue.isEmpty()) {
int size = queue.size();
for(int i = 0; i < size; i++) {
String node = queue.poll();
if(node.equals(s2)) {
return step;
}
char[] ss = node.toCharArray();
char[] ss2 = s2.toCharArray();
int j = 0;
for(; j < ss.length; j++) {
if(ss[j] != ss2[j]) {
break;
}
}
for(int k = j + 1; k < ss.length; k++) {
if(ss[k] == ss2[j]) {
// swap k, j;
swap(ss, k, j);
String newstr = new String(ss);
if(!visited.contains(newstr)) {
visited.add(newstr);
queue.offer(newstr);
}
// swap back;
swap(ss, k, j);
}
}
}
step++;
}
return -1;
}
private void swap(char[] ss, int i, int j) {
char temp = ss[i];
ss[i] = ss[j];
ss[j] = temp;
}
}