Program to find smallest value of K for K-Similar Strings in Python

Suppose we have two strings s and t. These two strings are K-similar if we can swap the positions of two letters in s exactly K times so that the resulting string is t. So, we have two anagrams s and t, we have to find the smallest K for which s and t are K-similar.

So, if the input is like s = "abc" t = "bac", then the output will be 1.

To solve this, we will follow these steps −

  • Define a function neighbors() . This will take new_data

  • for each index i and value c in new_data, do

    • if c is not same as t[i], then

      • come out from loop

  • for j in range i+1 to size of new_data - 1, do

    • if u[j] is same as t[i], then

      • exchange new_data[i] new_data[j]

      • generate a string by joining all elements from new_data and return, from next call, start again from this area

      • exchange new_data[i] new_data[j]

  • From the main method, do the following:

  • q := make one queue ans insert pair (s, 0)

  • seen := a new set from s

  • while q is not empty, do

    • (u, swap_cnt) := first item of q and delete it from q

    • if u is same as t, then

      • return swap_cnt

    • for each v in neighbors(u as list), do

      • if v is not in seen, then

        • mark v as seen

        • insert (v, swap_cnt+1) at the end of q

  • return 0


Let us see the following implementation to get better understanding

from collections import deque
def solve(s, t):
   def swap(data, i, j):
      data[i], data[j] = data[j], data[i]

   def neighbors(new_data):
      for i, c in enumerate(new_data):
         if c != t[i]: break

      for j in range(i+1, len(new_data)):
         if u[j] == t[i]:
            swap(new_data, i, j)
            yield "".join(new_data)
            swap(new_data, i, j)

   q = deque([(s, 0)])
   seen = set(s)
   while q:
      u, swap_cnt = q.popleft()
      if u == t:
         return swap_cnt
      for v in neighbors(list(u)):
         if v not in seen:
            q.append((v, swap_cnt+1))
   return 0

s = "abc"
t = "bac"
print(solve(s, t))


"abc, bac"