854. 相似度为 K 的字符串
字符串
s1
和s2
是k
相似 的(对于某些非负整数k
),如果我们可以交换s1
中两个字母的位置正好k
次,使结果字符串等于s2
。给定两个字谜游戏
s1
和s2
,返回s1
和s2
与k
相似 的最小k
。
示例 1:
输入:s1 = "ab", s2 = "ba" 输出:1示例 2:
输入:s1 = "abc", s2 = "bca" 输出:2
提示:
1 <= s1.length <= 20
s2.length == s1.length
s1
和s2
只包含集合{'a', 'b', 'c', 'd', 'e', 'f'}
中的小写字母s2
是s1
的一个字谜
失败,dfs一直超时,头疼
1. 起点步数为0,化解为求a变成b的最少步数问题
2. 每次用其中某个相同字符进行填写,挪动到对应位置
3. 找到了直接返回
- class Solution {
- public int kSimilarity(String s1, String s2) {
- Queue<String> queue = new LinkedList<>();
- Map<String,Integer> distances = new HashMap<>();
- distances.put(s1,0);
- queue.offer(s1);
- while (!queue.isEmpty()){
- String str = queue.poll();
- int nextStep = distances.get(str)+1;
- for(String next:getNext(str,s2)){
- if(next.equals(s2)) return nextStep;
- if(!distances.containsKey(next)){
- distances.put(next,nextStep);
- queue.offer(next);
- }
- }
-
- }
- return 0;
- }
-
- private List<String> getNext(String s,String hope){
- List<String> ans = new ArrayList<>();
- char[] cs1 = s.toCharArray();
- char[] cs2 = hope.toCharArray();
- int n = cs1.length;
- int i = 0;
- while (i<n&&cs1[i]==cs2[i]) ++i;
-
- for(int j = i+1; j < n; j++){
- if(cs1[j]!=cs2[j]&&cs1[j]==cs2[i]){
- swap(cs1,i,j);
- ans.add(new String(cs1));
- swap(cs1,i,j);
- }
- }
- return ans;
- }
-
- private void swap(char[] cs, int i, int j){
- char temp = cs[i];
- cs[i] = cs[j];
- cs[j] = temp;
- }
- }