854.K-Similar-Strings

854. K Similar Strings

题目地址

https://leetcode.com/problems/k-similar-strings/

题目描述

Strings A and B are K-similar (for some non-negative integer K) if we can swap the positions of two letters in A exactly K times so that the resulting string equals B.

Given two anagrams A and B, return the smallest K for which A and B are K-similar.

Example 1:
Input: A = "ab", B = "ba"
Output: 1

Example 2:
Input: A = "abc", B = "bca"
Output: 2

Example 3:
Input: A = "abac", B = "baca"
Output: 2

Example 4:
Input: A = "aabc", B = "abca"
Output: 2
Note:

1 <= A.length == B.length <= 20
A and B contain only lowercase letters from the set {'a', 'b', 'c', 'd', 'e', 'f'}

代码

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 : getNeighbors(S, B)) {
        if (!dist.containsKey(T)) {
          dist.put(T, dist.get(S) + 1);
          queue.offer(T);
        }
      }
    }
    throw null;
  }

  public List<String> getNeighbors(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;
  }

}

Last updated