2つの文字列アルゴリズムの質問の評価

今日、leecodeは基本的なアルゴリズムの問​​題を見ました。私の考えは非常に微妙だと感じています。これにより、学習のために記録します


1.効果的な文字のバリエーション

242.有効な手紙エイリアンの言葉

ここに画像の説明を挿入

文字の不快感は、2つの文字列の文字が同じであり、数が同じであり、順序が無視できることを意味します。

1ブルートフォースクラッキング

私の考えは、マップを使用して各文字の数を数え、次に2つのマップをトラバースすることです。比較します。2つのマップのネストされたトラバーサルの時間計算量はO(N²)です。スペースの複雑さはO(N)です。
コードは次のように表示されます。

public boolean isAnagram(String s, String t) {
    
    
        if (s.length() != t.length())
            return false;
        if (s.length() == 0) {
    
    
            return true;
        }
        Map<Character,Integer> ms=new HashMap<>();
        Map<Character,Integer> mt=new HashMap<>();
        char[] chs = s.toCharArray();
        char[] cht = t.toCharArray();
        for (int i=0;i<chs.length;i++){
    
    
            ms.put(chs[i],ms.getOrDefault(chs[i],0)+1);
        }
        for (int j=0;j<cht.length;j++){
    
    
            mt.put(cht[j],mt.getOrDefault(cht[j],0)+1);
        }

        for (Map.Entry<Character,Integer> s1:ms.entrySet()){
    
    
            for(Map.Entry<Character,Integer> s2:mt.entrySet()){
    
    
                Character key = s1.getKey();
                if(mt.get(key)==null || !mt.get(key).equals(s1.getValue())){
    
    
                    return false;
                }
            }
        }
        return true;
    }

ここに画像の説明を挿入
統計結果から、26%未満の時間しかかかりませんでした。

2配列を使用する

2つの文字配列を並べ替えてから、2つの配列が等しいかどうかを判別します。これも解決できます。時間計算量は、ソートアルゴリズムによって異なります。平均はO(nlogn)です

 public boolean isAnagram(String s, String t) {
    
    
        //特判,长度不同必定不是
        if (s.length()!=t.length()) return false;
        //两个字符串排序后是否相等
        char[] array1 = s.toCharArray();
        char[] array2 = t.toCharArray();
        Arrays.sort(array1);
        Arrays.sort(array2);
        return Arrays.equals(array1,array2);
    }

ここに画像の説明を挿入
これはすでに非常に強力です。

3カスタムハッシュ操作

まず、2つの文字列を文字配列に変換します。長さが26の文字配列を定義します。格納されるのは、sの各文字に対応するASCIIコードテーブル値とaのコードテーブル値の差です。複数ある場合は、それ自体で増やします。tはそれ自体をデクリメントするだけです。最後に、この配列がすべて0であるかどうかを確認します。

 public static boolean isAnagram(String s, String t) {
    
    
        //总共有26个字母
        char[] arr = new char[26];
        char[] chs = s.toCharArray();
        char[] cht = t.toCharArray();
        //
        for (int i = 0; i < chs.length; i++) {
    
    
            arr[chs[i] - 'a']++;
        }
        for (int j = 0; j < cht.length; j++) {
    
    
            arr[cht[j] - 'a']--;
        }
        for (int k = 0; k < 26; k++) {
    
    
            if (arr[k] != 0) {
    
    
                return false;
            }
        }
        return true;

    }

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/GoSaint/article/details/114681030