LeetCodeブラッシングノート_49。文字エイリアンワードのグループ化

トピックはLeetCodeからです

49.エイリアンの文字のグループ化

他のソリューションまたはソースコードにアクセスできます:tongji4m3

解説

文字列の配列を指定して、ディスレクシアという文字を組み合わせます。脂肪族の単語とは、文字は同じだが配置が異なる文字列を指します。

例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

説明:

すべてのエントリは小文字です。
回答が出力される順序は考慮されません。

アイデア

マップを使用して、インデックスとインデックスの対応するグループを格納します。インデックスは、文字の不快感から計算された一意の識別子です。このようにして、strs配列を走査し、同じグループ内に同じインデックスを持つ文字列を配置します。

インデックスの計算に関しては、各文字を素数に束縛することができます。文字列の場合、含まれている各文字の素数を乗算し、合計がインデックスです

2番目の記述方法は前の記述方法と似ています。mapは辞書式文字列と対応するグループを格納します。ループのたびに文字列を辞書式文字列に変換し、判断します

細部

マップはゾーンのグループ化に使用されるインデックスを直接格納し、リストグループはメモリを節約するために使用できます

コード

//生成素数
private List<Integer> prime()
{
    
    
    int N = 26;
    List<Integer> result = new LinkedList<>();

    for (int i = 2; i < 1000; i++)
    {
    
    
        int j;
        for (j = i - 1; j > 1; j--)
        {
    
    
            if (i % j == 0) break;
        }
        if(j==1) result.add(i);
        if(result.size()==N) break;
    }
    return result;
}
//素数可以提前生成好
public List<List<String>> groupAnagrams(String[] strs)
{
    
    
    Map<Integer, List<String>> map = new HashMap<>();
    //List<Integer> prime = prime();
    //预先准备好
    int[] prime = {
    
    2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101};
    for (String string : strs)
    {
    
    
        int index = 1;
        for (char ch : string.toCharArray())
        {
    
    
            //                index*=prime.get(ch - 'a');
            index*=prime[ch-'a'];
        }
        if(!map.containsKey(index)) map.put(index, new LinkedList<>());
        map.get(index).add(string);
    }
    return new LinkedList<>(map.values());
}
//第二种思路
//map存储字典序字符串和对应的组。每次循环都把字符串转为字典序字符串,再判断
public List<List<String>> groupAnagrams1(String[] strs)
{
    
    
    Map<String, List<String>> map = new HashMap<>();
    for (int i = 0; i < strs.length; i++)
    {
    
    
        //map中只存储字典序字符串
        char[] chars = strs[i].toCharArray();
        Arrays.sort(chars);
        String string = String.valueOf(chars);
        //第一次放入某类型的字母异位词
        if (!map.containsKey(string)) map.put(string, new LinkedList<>());

        map.get(string).add(strs[i]);
    }
    return new LinkedList<>(map.values());
}

複雑さの分析

時間の複雑さ

最初の方法:O(NK)O(NK)O N K Nは配列の長さ、Kは文字列の最大長です。外側のループは文字列配列を1回トラバースする必要があり、内側のループは各文字列のインデックスを計算する必要があります。

2番目の方法:O(NK log⁡K)O(NK \ log K)O N Klo gK Nは配列の長さ、Kは文字列の最大長です。外側のループは文字列配列を1回トラバースする必要があります。各文字列は内部でソートする必要があります

スペースの複雑さ

O(NK)O(NK) O N K マップの値に格納するには、合計NKスペースが必要です

おすすめ

転載: blog.csdn.net/weixin_42249196/article/details/108212837