Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 K-유사 문자열

<시간/>

두 개의 문자열 A와 B가 있다고 가정합니다. 결과 문자열이 B가 되도록 A에서 두 문자의 위치를 ​​정확히 K번 교환할 수 있다면 이 두 문자열은 K 유사합니다(여기서 K는 음이 아닌 정수 하나). 두 개의 아나그램 A와 B, 우리는 A와 B가 K-유사한 가장 작은 K를 찾아야 합니다.

따라서 입력이 A ="abc", B ="bac"와 같으면 출력은 2가 됩니다.

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

  • 함수 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씩 증가)

      • 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