C ++中按字典分类的最小等效字符串

假设我们具有相同长度的字符串A和B,现在我们可以说A [i]和B [i]是等效字符。因此,例如,如果A =“ abc”和B =“ cde”,则我们有'a'='c','b'='d'和'c'='e'。等效字符遵循任何等效关系的通常规则:

  • 自反性:“ a” =“ a”

  • 对称性:“ a” =“ b”表示“ b” =“ a”

  • 及物性:'a'='b'和'b'='c'表示'a'='c'

现在,例如,考虑到上面A和B的等效信息,S =“ eed”,“ acd”和“ aab”是等效字符串,而“ aab”是S在字典上最小的等效字符串。在这里,我们必须找到通过使用来自A和B的等价信息,获得S的词典上最小的等效字符串。以词典的顺序返回可以这种方式形成的所有单词。

因此,如果输入类似于A =“ parker”,B =“ morris”和S =“ parser”,则输出将为“ makkek”。这是因为基于A和B中的等效信息,我们可以将它们的字符分组为[m,p],[a,o],[k,r,s],[e,i]。因此,每个组中的字符是等价的,并按字典顺序排序。因此答案是“ makkek”。

为了解决这个问题,我们将遵循以下步骤-

  • 创建一个名为parent的数组

  • 定义一个名为的方法getParent(),它将使用字符x

  • 如果parent [x – ASCII'a']为-1,则返回x-ASCII'a'

  • parent [x –'a'的ASCII]:= getParent('a'的ASCII + parent [x –'a'的ASCII])

  • 返回parent [x –'a'的ASCII]

  • 创建另一个方法,称为union()a和b

  • parentA:= getParent(a)和parent:= getParent(b)

  • 因此,如果parentA =父级,则在parentA <父级时返回,否则返回parent [parentB]:= parentA,否则返回parent [parentA]:= parent

  • 从主要方法中,执行以下操作-

  • 设置parent:=大小为26的数组,并使用-1填充它

  • 当我在0到25的范围内

    • 执行联合(A [i],B [i])

  • 创建一个空白字符串ret

  • 对于0到S大小的i

    • ret:= ret + getParent(S [i])+'a'

  • 返回ret

让我们看下面的实现以更好地理解-

示例

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   vector <int> parent;
   int getParent(char x){
      //cout << x << "-- " << x-'a' << endl;
      if(parent[x - 'a'] == -1) return x - 'a';
      return parent[x - 'a'] = getParent('a' + parent[x - 'a']);
   }
   void unionn(char a, char b){
      int parentA = getParent(a);
      int parentB = getParent(b);
      if(parentA == parentB) return;
      if(parentA < parentB){
         parent[parentB] = parentA;
      }else{
         parent[parentA] = parentB;
      }
   }
   string smallestEquivalentString(string A, string B, string S) {
      parent = vector <int>(26, -1);
      for(int i = 0; i < A.size(); i++){
         unionn(A[i], B[i]);
      }
      string ret = "";
      for(int i = 0; i < S.size(); i++){
         ret += getParent(S[i]) + 'a';
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout <<
   (ob.smallestEquivalentString("parker","morris","parser"));
}

输入项

"parker"
"morris"
"parser"

输出结果

makkek