C++ 中的 K-相似字符串


假设我们有两个字符串 A 和 B。如果我们可以精确交换 A 中两个字母的位置 K 次(K 为非负整数),从而使结果字符串为 B,则这两个字符串是 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

  • 定义一个集合 visited

  • 将 A 插入 visited

  • 定义一个队列 q,将 A 插入 q

  • 从 lvl := 1 开始,当 q 不为空时,更新(lvl 加 1),执行:

    • sz := q 的大小

    • 当 sz 不为零时,每次迭代 sz 减 1,执行:

      • curr := q 的第一个元素

      • 从 q 中删除元素

      • i := 0

      • 当 (i < curr 的大小且 curr[i] 与 B[i] 相同) 时,执行:

        • (i 加 1)

      • 从 j := i + 1 开始,当 j < curr 的大小时,更新 (j 加 1),执行:

        • 如果 curr[i] 与 curr[j] 相同,则:

          • 忽略以下部分,跳到下一次迭代

        • 如果 curr[j] 不等于 B[i],则:

          • 忽略以下部分,跳到下一次迭代

        • 如果 curr[j] 与 B[j] 相同,则:

          • 忽略以下部分,跳到下一次迭代

        • swapp(curr, i, j)

        • 如果 curr 与 B 相同,则:

          • 返回 lvl

        • 如果 visited 中不包含 curr,则:

          • 将 curr 插入 visited

          • 将 curr 插入 q

        • swapp(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

更新于:2020年6月4日

232 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.