C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の同形文字列


2つの文字列sとtがあるとします。それらが同型であるかどうかをチェックする必要があります。 sの文字を置き換えてtを取得できる場合、2つの文字列は同型であると言われます。

文字の順序を維持しながら、出現するすべての文字を別の文字に置き換える必要があります。 2人のキャラクターが同じキャラクターにマップすることはできませんが、キャラクターはそれ自体にマップすることができます。

したがって、入力がs ="egg"、t ="add"のような場合、eはaにマップでき、gはdにマップできるため、出力はtrueになります。

これを解決するには、次の手順に従います-

  • サイズ256の配列arrを定義し、-1で埋めます

  • サイズ256の訪問済み配列を定義し、0で埋めます

  • サイズ256のvisited1配列を定義し、0で埋めます

  • 初期化i:=0の場合、i

    • visited [s [i]]が1と同じか、visited1 [t [i]]が1と同じ場合、-

      • arr [s[i]]がt[i]-'a'のASCIIと等しくない場合、-

        • falseを返す

    • それ以外の場合

      • 訪問済み[s[i]]:=1

      • visited1 [t [i]]:=1

      • arr [s [i]]:=t[i]-'a'のASCII

  • trueを返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool isIsomorphic(string s, string t) {
      vector<int> arr(256, -1);
      vector<bool> visited(256, 0);
      vector<bool> visited1(256, 0);
      for (int i = 0; i < s.length(); i++) {
         if (visited[s[i]] == 1 || visited1[t[i]] == 1) {
            if (arr[s[i]] != t[i] - 'a') {
               return false;
            }
         }
         else {
            visited[s[i]] = 1;
            visited1[t[i]] = 1;
            arr[s[i]] = t[i] - 'a';
         }
      }
      return true;
   }
};
main(){
   Solution ob;
   cout << (ob.isIsomorphic("sky","fry"));
}

入力

"sky","fry"

出力

1

  1. C++での2つの文字列の最大のマージ

    2つの文字列「a」と「b」および文字列「merge」があると仮定します。タスクは、文字列「merge」に「a」と「b」の文字を次のように入力することです。 文字列aが空でない場合は、文字列aから最初の文字を削除し、文字列mergeにコピーします。 文字列bが空でない場合は、文字列bから最初の文字を削除し、文字列mergeにコピーします。 文字列aおよびbが空でない場合は、文字列aから最初の文字を削除し、それを文字列 mergeにコピーしてから、文字列bから最初の文字(存在する場合)を削除します。 そしてそれを文字列mergeにコピーします。 辞書式順序で両方の文字列から文字を削除します。つま

  2. ツリーがC++で同形であるかどうかを確認します

    二分木では、各ノードに2つの子、つまり左の子と右の子が含まれます。 2つの二分木があり、タスクは、ツリーの1つが、別のツリーを左にひっくり返すことによって取得できるかどうかを確認することであると仮定します。 左側にある他のツリーを反転して取得できる場合、ツリーは同型です。 例 入力-1 出力: 同形 説明: 与えられたTree-2は、左側のTree-1を反転することで取得できるため、Treeは同型です。 この問題を解決するためのアプローチ この特定の問題を解決するための再帰的なアプローチは、ブール関数が両方のツリーのルートノードをチェックすることです。両方のツリーの