LeetCode 49: внематочная непристойность пакет Группы Анаграмма

LeetCode 49: внематочная непристойность пакет Группы Анаграмма

тема:

Учитывая массив строк, эктопические слово буквы вместе. Внематочная слово буквы обозначают теми же буквами, но расположены в разных строках.

Дан массив строк, группа анаграммы вместе.

Пример:

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

Описание:

  • Все входы строчные буквы.
  • Порядок ответов, которые не были рассмотрены.

Заметка:

  • Все входы будут в нижнем регистре.
  • Порядок вашей продукции не имеет значения.

Проблемно-разрешающие идеи:

Какой бы ни была предметом запроса является такой же, как свойство буквы в алфавитном порядке, как долго, как класса, до тех пор, как все слова в алфавитном порядке в соответствии с определенными правилами хорошо, до тех пор, как ту же строку букв в каждом слове выстраиваются в линию в соответствии с законом, оно классифицируется как категория

Сортировка писем Решение проблемы:

Хэш карта {Key : Value}ключа строка сортируется, массив значений, сохраняя то же самое письмо Ключевые слова, и каждое слово перемещения сортируются письма, чтобы выяснить, присутствуют ли в Кис отсортированные строки, можно использовать хэш - карту операция поиск времени уменьшается сложность O (1)

Какие решения логики (в алфавитном порядке по возрастанию в настоящем документе):

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
建立哈希映射 map = {}
遍历该字符串数组:

第一个单词: "eat" --> "aet"
"aet" 不存在于 map, 建立映射 {"aet" : [ "eat" ] }

第二个单词: "tea" --> "aet"
"aet" 存在于 map, 加入其 Values {"aet" : [ "eat" , "tea" ] }

第三个单词: "tan" --> "ant"
"ant" 不存在于 map, 建立映射  {"aet" : [ "eat" , "tea" ] ; "ant" : [ "tan" ] }

第四个单词: "ate" --> "aet"
"aet" 存在于 map, 加入其 Values {"aet" : [ "eat" , "tea" , "ate" ] ; "ant" : [ "tan" ] }

......

map = {"aet" : [ "eat" , "tea" , "ate" ] ; "ant" : [ "tan" , "nat"] ; "abt" : [ "bat" ] }

返回该哈希映射的 Values 组成的数组:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

Сложность:

  • Сложность Время: O (N * (К * logK)), где N представляет собой длину STRs, и К представляет собой максимальную длину строки STRs. Обход каждой строки сложность O (N). Сортировка функций с помощью встроенной в письме сложности сортировки времени строка O (K * logK).

  • Космическая сложность: O (N * K), в пространстве для хранения данных карт занята.

Проблемная статистика частоты слова:

Этот метод решения проблем может также повторно оптимизирована работа строки сортировки могут быть опущены.

Подумайте об этом, слово до 26 букв английского алфавита, вы не можете установить его в качестве хэш-карта ?:

对于单词 "aeat" :
建立哈希映射{ 'a' : 2 ; 'e' : 1; t : 1 }

как следует ключевое слово, значение частоты появления. Если вы идете через каждую клавишу, чтобы определить, является ли той же буквой, а затем определить, совпадает ли число вхождений, что, очевидно, более сложным.

Частота появления каждой буквы может состоять из следующих друг за другом символов:

每个字母 a-z 出现频次: [2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0]
组成字符串: "20001000000000000001000000"

Просто определить, является ли частота каждого слова буквы строк те же времена на нем.

Вы также можете задать для оптимизации частоты слова, число фиксированных 26 буквы, установить прямую массив длиной 26, 26 писем от имени своей позиции индекса, пересекающим слово из букв, каждая буква появляется один раз в письмо от имени элементов в массиве значение плюс 1.

Это позволяет избежать операции сортировки

Сортировка писем Решение проблемы:

Джава:

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        if(strs.length==0) return new ArrayList<>();
        Map<String, List<String>> map = new HashMap<>();//建立映射关系
        for (String s : strs) {//遍历该字符串数组
            char[] chs = s.toCharArray();//转成字符
            Arrays.sort(chs);//排序字符串字母
            String key = String.valueOf(chs);//转成字符串
            if(!map.containsKey(key)) map.put(key, new ArrayList<>());//如果 key 不存在, 新建映射关系
            map.get(key).add(s);//加入其对应的 Value 所在的数组
        }
        return new ArrayList(map.values());//返回 Values 组成的数组
    }
}

Python:

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        ans = collections.defaultdict(list) # 建立映射关系
        for s in strs: # 遍历该字符串数组
            ans[tuple(sorted(s))].append(s) # sorted(s):排序字符串字母, 并加入其对应的 Value 所在的数组
        return ans.values() # 返回 Values 组成的数组

Проблемная статистика частоты слова:

Джава:

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs.length == 0) return new ArrayList<>();
        Map<String, List<String>> map = new HashMap<>();// 建立映射关系
        for (String s : strs) {//遍历该字符串数组
            int[] count = new int[26];//建立一个 26 字母的映射关系
            for (char c : s.toCharArray()) count[c - 'a']++;//遍历字字符串每个字母统计每个字母出现的频次
            String key = Arrays.toString(count);//转成字符串
            if (!map.containsKey(key)) map.put(key, new ArrayList<>());//如果 key 不存在, 新建映射关系
            map.get(key).add(s);//加入其对应的 Value 所在的数组
        }
        return new ArrayList(map.values());//返回 Values 组成的数组
    }
}

Python:

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        ans = collections.defaultdict(list)# 建立映射关系
        for s in strs: # 遍历该字符串数组
            count = [0] * 26 # 建立一个 26 字母的映射关系
            for c in s: # 遍历字字符串每个字母
                count[ord(c) - 97] += 1 # 每个字母出现的频次(元素值)加1
            ans[tuple(count)].append(s) # 加入其对应的 Value 所在的数组
        return ans.values() # 返回 Values 组成的数组

Добро пожаловать внимание на микро-канал общедоступный номер: Write Love Bug

Я люблю писать Bug.png

рекомендация

отwww.cnblogs.com/zhangzhe532/p/12003780.html
49
рекомендация