データ構造とアルゴリズム: 同型文字列

データ構造とアルゴリズム: 同型文字列

[[441407]]

同型文字列

LeetCode の質問へのリンク: https://leetcode-cn.com/problems/isomorphic-strings

2 つの文字列 s と t が与えられた場合、それらが同型であるかどうかを判断します。

s 内の文字を何らかのマッピングで置き換えて t を取得できる場合、2 つの文字列は同型です。

文字の出現ごとに、文字の順序を変更せずに別の文字にマッピングする必要があります。異なる文字を同じ文字にマッピングすることはできません。同じ文字は同じ文字にのみマッピングできます。また、文字はそれ自身にマッピングできます。

例1:

  • 入力: s = "egg"、t = "add"
  • 出力: true

例2:

  • 入力: s = "foo"、t = "bar"
  • 出力: false

例3:

  • 入力: s = "paper"、t = "title"
  • 出力: true

ヒント: s と t は同じ長さであると仮定できます。

アイデア

文字列に小文字がすべて含まれているわけではないので、配列を使用することは適切ではありません。マッピングには map を使用します。

2つのマップを使用して、s[i]とt[j]、t[j]とs[i]間のマッピング関係を保存します。対応がないことが判明した場合は、すぐにfalseを返します。

C++ コードは次のとおりです。

  1. クラスソリューション{
  2. 公共
  3. bool isIsomorphic(文字列 s, 文字列 t) {
  4. unordered_map< char , char > map1;
  5. unordered_map< char , char > map2;
  6. ( int i = 0, j = 0; i < s.size ( ); i++, j++) {
  7. if (map1.find(s[i]) == map1.end ()) { // map1はs[i]からt[j]へのマッピングを保存します
  8. map1[s[i]] = t[j];
  9. }
  10. if (map2.find(t[j]) == map2.end ()) { // map2はt[j]からs[i]へのマッピングを保存します
  11. map2[t[j]] = s[i];
  12. }
  13. // マッピングが一致しない場合は、すぐにfalseを返します 
  14. もし (map1[s[i]] != t[j] || map2[t[j]] != s[i]) {
  15. 戻る 間違い;
  16. }
  17. }
  18. 戻る 真実;
  19. }
  20. };

その他の言語

ジャワ

  1. クラスソリューション{
  2. パブリックブール値 isIsomorphic(文字列 s, 文字列 t) {
  3. Map<文字,文字> map1 = new HashMap<>();
  4. Map<文字,文字> map2 = new HashMap<>();
  5. ( int i = 0, j = 0; i < s.length(); i++, j++) {
  6. map1.containsKey(s.charAt(i)) の場合 {
  7. map1.put(s.charAt(i), t.charAt(j)); // map1はs[i]からt[j]へのマッピングを保存します
  8. }
  9. map2.containsKey(t.charAt(j)) の場合 {
  10. map2.put(t.charAt(j), s.charAt(i)); // map2はt[j]からs[i]へのマッピングを保存します
  11. }
  12. // マップできないのでfalseを返す 
  13. (map1.get(s.charAt(i)) != t.charAt(j) || map2.get(t.charAt(j)) != s.charAt(i)) の場合 {
  14. 戻る 間違い;
  15. }
  16. }
  17. 戻る 真実;
  18. }
  19. }

パイソン

  1. クラスソリューション:
  2. def isIsomorphic(self, s: str, t: str) -> bool:
  3. default_dict1 = デフォルト辞書(str)
  4. default_dict2 = defaultdict(str)
  5.  
  6. len(s) != len(t) の場合:戻り値 間違い 
  7.  
  8. iが範囲(len(s))内にある場合:
  9. default_dict1[s[i]]でない場合:
  10. default_dict1[s[i]] = t[i]
  11.  
  12. default_dict2[t[i]]でない場合:
  13. default_dict2[t[i]] = s[i]
  14.  
  15. default_dict1[s[i]] != t[i]またはdefault_dict2[t[i]] != s[i] の場合:
  16. 戻る 間違い 
  17.  
  18. 戻る 真実 

行く

  1. func isIsomorphic(s 文字列, t 文字列) bool {
  2. map1 := make(map[byte]byte)
  3. map2 := make(map[byte]byte)
  4. i := 範囲 s {
  5. _の場合、ok := map1[s[i]]; !ok {
  6. map1[s[i]] = t[i] // map1はs[i]からt[j]へのマッピングを格納します
  7. }
  8. _の場合、ok := map2[t[i]]; !ok {
  9. map2[t[i]] = s[i] // map2はt[i]からs[j]へのマッピングを格納します
  10. }
  11. // マップできないのでfalseを返す 
  12. もし (map1[s[i]] != t[i]) || (map2[t[i]] != s[i]) {
  13. 戻る 間違い 
  14. }
  15. }
  16. 戻る 真実 
  17. }

JavaScript

  1. var isIsomorphic =関数(s, t) {
  2. len = s.length;とします。
  3. if(len === 0)戻り値 真実;
  4. maps = new Map();
  5. mapt = new Map();
  6. (i = 0, j = 0; i < len; i++, j++)の場合{
  7. (!maps.has(s[i]))の場合{
  8. maps.set (s[i],t[j]); // mapsはs[i]からt[j]へのマッピングを保存します
  9. }
  10. (!mapt.has(t[j]))の場合{
  11. mapt.set (t[j],s[i]); // maptはt[j]からs[i]へのマッピングを保存します
  12. }
  13. // マップできないのでfalseを返す 
  14. if(maps.get(s[i]) !== t[j] || mapt.get(t[j]) !== s[i]){
  15. 戻る 間違い;
  16. }
  17. };
  18. 戻る 真実;
  19. };

<<:  人工知能は「絶滅危惧」言語の保護に大きな役割を果たすかもしれません!

>>:  段階的な自動運転は後から追いつくことができるか?

ブログ    
ブログ    
ブログ    

推薦する

IoT/AIプロジェクトへの投資家を見つけるのに最適な方法

問題を解決するには、説明するのではなく検証する[[284237]]多くの IoT プロジェクトの提示...

Pythonでグラフを描いてニューラルネットワークを理解する

Python 中国語コミュニティ (ID: python-china)人工ニューラル ネットワーク ...

ひと口引くとバラが生き返ります! Googleは画像ダイナミクスを生成することを提案しており、すべてのものに魂が宿ることになる

ほら、軽く引っ張るとバラが動きますよ。葉を左にドラッグすると、松の木も同じ方向に移動します。引っ張る...

...

デジタルマーケティングにおけるAI革命

ほんの数年前までは、マーケティングに特化した AI エンジンがマーケティングの未来につながると信じて...

...

空中で疫病と戦うドローン

新型コロナウイルス肺炎の流行が始まって以来、多くのハイテク技術がこの疫病との戦いに後方支援を提供して...

よく使われる 3 つの C# ソート アルゴリズム

C# アルゴリズムは、C# 言語学習の重要な部分です。C# ソート アルゴリズムは、言語の基礎とデー...

Buildで発表された新しいMicrosoft Store AIハブが現在展開中

7月11日、ネットユーザーは、MicrosoftがBuildカンファレンスで発表した新しいMicro...

...

機械学習を拡張するための5つのポイント

Facebook は効果的な人工知能について私たちに多くのことを教えてくれます。最近のガートナー社の...

人工知能は人類のより良い生活を可能にする

新世代人工知能の活発な発展は、科学技術革新と産業のアップグレードと変革の産業推進の焦点となり、経済社...

テンセントが自動運転車市場に参入、百度セキュリティが共同で「OASESスマート端末セキュリティエコロジカルアライアンス」を設立

テンセントは自動運転システムを開発し、無人運転市場への参入も狙っている。百度セキュリティはファーウェ...

...

10000000000!マイクロソフトはTransformerを改良し、一度に多くのトークンを記憶できるようにした

Microsoft Research Asia の最新の調査は少々衝撃的だ。彼らは、実際にトークンを...