[今日の1つの質問] Likou 205:同形文字列

タイトルの説明(ポータル

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

sの文字を置き換えてtを取得できる場合、2つの文字列は同型です。

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

例1:

输入: s = "egg", t = "add"
输出: true

例2:

输入: s = "foo", t = "bar"
输出: false

例3:

输入: s = "paper", t = "title"
输出: true

問題解決のアイデア

エラーの例

まず、タイトルは文字ですので、文字だけでなく、さまざまな文字にも注意を払う必要があります。ASICコード表を見てみましょう。
ここに画像の説明を挿入
ここには合計128文字があります。配列
を初期化すると、サイズは26ではなく128になります。サイズが128の2つの配列を初期化し、2つの文字列をトラバースしてから、各文字をカウントしてから、配列内に1を追加します。文字列の対応する位置を判断するときの配列内のサイズ。

 public boolean isIsomorphic(String s, String t) {
    
    
      int[] sarray = new int[128];
        int[] tarray = new int[128];
        
        if (s.length() != t.length()) {
    
    
            return false;
        }
        for (int i = 0; i < s.length(); i++) {
    
    
            if (sarray[s.charAt(i)] != tarray[t.charAt(i)]) {
    
    
                return false;
            }
            sarray[s.charAt(i)] ++;
            tarray[t.charAt(i)] ++;
        }
        return true;
    }

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
このように、例1では問題はありませんが、送信を完全に渡すことはできません。
ここに画像の説明を挿入
たとえば、
s = "aba"
t = "baa"の場合、
ここに画像の説明を挿入
それらの数は常に同じであると判断されるため、trueが返され、正しければfalseが返されます。
これは、最初の2つのabとbaが次のように前のステップにつながるためです。ここに画像の説明を挿入

正しい考え方

1ずつインクリメントするたびに、どのサイクル操作が実行されたかを区別することはできません。この問題は、各ループに追加される番号が異なるが、2つの配列内の対応する文字の位置が同じ番号で追加される場合に解決できます。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
したがって、ループを繰り返すことなく、ループを繰り返すたびに変更された値を追加するだけで済みます。値を個別に定義することはできますが、ループ内のiの値は常に変化し、iの追加は1回繰り返されません。

実装コード

 public boolean isIsomorphic(String s, String t) {
    
    
      int[] sarray = new int[128];
        int[] tarray = new int[128];
        
        if (s.length() != t.length()) {
    
    
            return false;
        }
        for (int i = 0; i < s.length(); i++) {
    
    
            if (sarray[s.charAt(i)] != tarray[t.charAt(i)]) {
    
    
                return false;
            }
            sarray[s.charAt(i)] = i + 1 ;
            tarray[t.charAt(i)] = i + 1;
        }
        return true;
    }

iが0から始まることを考えると、識別は十分ではありません。したがって、1を追加します。ここで1は自由に変更できます。

HashMap

ここでは、コードに応じて2つのHashMapが使用されていますが、説明はされていません。

public boolean isIsomorphic(String s, String t) {
    
    
        Map<Character, Character> s2t = new HashMap<Character, Character>();
        Map<Character, Character> t2s = new HashMap<Character, Character>();
        int len = s.length();
        for (int i = 0; i < len; ++i) {
    
    
            char x = s.charAt(i), y = t.charAt(i);
            if ((s2t.containsKey(x) && s2t.get(x) != y) || (t2s.containsKey(y) && t2s.get(y) != x)) {
    
    
                return false;
            }
            s2t.put(x, y);
            t2s.put(y, x);
        }
        return true;
    }


おすすめ

転載: blog.csdn.net/weixin_45532227/article/details/111830801