効果的な文字アナグラム

創造し続け、成長を加速!「ナゲッツデイリー新プラン・10月アップデートチャレンジ」参加6日目です、イベント詳細はこちら

序文

以前、シャオ・リウリウは自分のアルゴリズムが比較的悪いと感じていましたが、それは欠点でした.以前は、実際に3日間釣りをし、2日間網を乾かし、数日間ブラッシングをしていましたが、徐々に固執するのをやめました.第二弾は、プラットフォームの活動の助けを借りて、ゆっくりとブラッシングを開始する予定です.この機会に自分の欠点を補うこともできます. 頑張ってください.

リンクされたリストのコレクション

トピック

2 つの文字列 s と t が与えられた場合、t が s のアナグラムかどうかを判断する関数を作成します。

例 1: 入力: s = "anagram", t = "nagaram" 出力: true

例 2: 入力: s = "rat", t = "car" 出力: false

説明:  文字列には小文字のみが含まれていると想定できます。

例 1:

输入: s = "anagram", t = "nagaram"
输出: true
复制代码

例 2:

输入: s = "rat", t = "car"
输出: false
复制代码

暴力的なソリューション、2 層 for ループ

これは書きません. アイデアは 2 層の for ループを持ち, また文字が繰り返されるかどうかを記録することです. 明らかに, 時間の計算量は O(n^2).

選別

t は ss のアナグラムであり、「2 つの文字列が等しい」と等価です。したがって、文字列 ss と tt をそれぞれソートし、ソートされた文字列が等しいかどうかを判断できます。さらに、ss と tt の長さが異なる場合、tt は ss のアナグラムであってはなりません。

class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        char[] str1 = s.toCharArray();
        char[] str2 = t.toCharArray();
        Arrays.sort(str1);
        Arrays.sort(str2);
        return Arrays.equals(str1, str2);
    }
}
复制代码

ハッシュ表

別の見方をすれば、tt は ss のアナグラムであり、これは「2 つの文字列の文字が同じ種類と回数で出現する」ことに相当します。文字列には 2626 個の小文字のみが含まれているため、長さ 2626 の頻度配列テーブルを維持できます。まず、レコード文字列 ss 内の文字の出現頻度をトラバースし、次に文字列 tt をトラバースして、テーブル内の対応する頻度を差し引きます。 、if [i]<0table[i]<0 の場合、tt には ss にない余分な文字が含まれていることを意味し、false を返すだけで十分です。

class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        int[] table = new int[26];
        for (int i = 0; i < s.length(); i++) {
            table[s.charAt(i) - 'a']++;
        }
        for (int i = 0; i < t.length(); i++) {
            table[t.charAt(i) - 'a']--;
            if (table[t.charAt(i) - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
}
复制代码

画像.png

終了

さぁ、今日はこちらです、シャオ・リウリウです、3日間釣りをして、2日間ネットを張っています!

おすすめ

転載: juejin.im/post/7150294939916566564