Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

C++에서 K-유사 문자열에 대한 K 값을 찾는 프로그램

<시간/>

두 개의 문자열 s와 t가 있다고 가정합니다. 이 두 문자열은 결과 문자열이 t가 되도록 s에 있는 두 문자의 위치를 ​​정확히 K번 교환할 수 있을 때 K 유사합니다. 두 개의 아나그램 s와 t가 있고 s와 t가 K-유사한 가장 작은 K를 찾아야 합니다.

따라서 입력이 s ="abc", t ="bac"와 같으면 출력은 1이 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 함수 swapp()를 정의하면 문자열 s, i, j,

    가 사용됩니다.
  • x :=s[i], y :=s[j]

  • s[i] :=y, s[j] :=x

  • 주요 방법에서 다음을 수행하십시오 -

  • A가 B와 같으면 0을 반환합니다.

  • 방문한 한 세트 정의

  • 방문에 A 삽입

  • 하나의 대기열 q를 정의하고 A를 q에 삽입

  • initialize lvl :=1의 경우 q가 비어 있지 않으면 업데이트(lvl을 1씩 증가)하고 -

    를 수행합니다.
    • sz :=q의 크기

    • sz가 0이 아닌 동안 각 반복에서 sz를 1씩 줄입니다.

      • curr :=q의 첫 번째 요소

      • q에서 요소 삭제

      • 나는 :=0

      • 동안 (i

        • (i를 1씩 증가)

      • for initialize j :=i + 1, j

        • curr[i]가 curr[j]와 같은 경우:

          • 다음 부분은 무시하고 다음 반복으로 건너뜁니다.

        • curr[j]가 B[i]와 같지 않으면:

          • 다음 부분은 무시하고 다음 반복으로 건너뜁니다.

        • curr[j]가 B[j]와 같은 경우:

          • 다음 부분은 무시하고 다음 반복으로 건너뜁니다.

        • 스왑(curr, i, j)

        • curr이 B와 같은 경우:

          • 레벨을 반환

        • 방문 횟수(curr)가 아닌 경우:

          • 방문에 curr 삽입

          • q에 curr 삽입

        • 스왑(curr, i, j)

  • 반환 -1

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다.

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
   int kSimilarity(string A, string B) {
      if (A == B)
         return 0;
      unordered_set<string> visited;
      visited.insert(A);
      queue<string> q;
      q.push(A);
      for (int lvl = 1; !q.empty(); lvl++) {
         int sz = q.size();
         while (sz--) {
            string curr = q.front();
            q.pop();
            int i = 0;
            while (i < curr.size() && curr[i] == B[i])
               i++;
            for (int j = i + 1; j < curr.size(); j++) {
               if (curr[i] == curr[j])
                  continue;
               if (curr[j] != B[i])
                  continue;
               if (curr[j] == B[j])
                  continue;
               swapp(curr, i, j);
               if (curr == B)
                  return lvl;
               if (!visited.count(curr)) {
                  visited.insert(curr);
                  q.push(curr);
               }
               swapp(curr, i, j);
            }
         }
      }
      return -1;
   }
   void swapp(string &s, int i, int j) {
      char x = s[i];
      char y = s[j];
      s[i] = y;
      s[j] = x;
   }
};

main(){
   Solution ob;
   cout << (ob.kSimilarity("abc", "bac"));
}

입력

"abc", "bac"

출력

1