[虚拟机OA]Group Anagram 变位词归类

Given an array of strings, group anagrams together.

Example:

Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

题意:

给定一堆单词,把变位词放一块儿去。

碎碎念:

开始想说“eat” 转charArray {‘e‘, ‘a‘, ‘t‘}

“tea” 转charArray {‘t‘, ‘e‘, ‘a‘}

这样,我就错误的蜜汁以为以上charArray是相等的!

于是用一个Map<char[],  List<Integer>> map 来边扫input 边更新map。

为何要用List<Integer> ? 我蜜汁绕弯的想将index存下,最后再取出index对应的input string。 (自己都翻白眼啊!)

正确且高效的改进是,

sort “eat” 转charArray {‘e‘, ‘a‘, ‘t‘}  为字典排序 {‘a‘, ‘e‘, ‘t‘}

sort “tea” 转charArray {‘t‘, ‘e‘, ‘a‘}  为字典排序 {‘a‘, ‘e‘, ‘t‘}

Map<String,  List<String>> map 来存 <变位词sort后的同一结果,  各种可能的变位词>

Solution1:  HashMap

(1) convert each string to charArray, sort such charArray to make sure anagrams has uniform reference

(2) hashmap

(3) get all map.values()

code

/*
Time: O(n).  We traverse the input array
Space: O(n). We allocate a hashmap
*/
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> result = new ArrayList<>();
        // corner case
        if(strs ==null) return result;

        Map<String,List<String>> map = new HashMap<>();   

        for(int i = 0; i< strs.length; i++){
            char [] curr = strs[i].toCharArray();
            Arrays.sort(curr);  // to make sure anagrams has uniform reference
            String key = String.valueOf(curr);
            if(!map.containsKey(key)){
                map.put(key,new ArrayList<String> ());
            }
            map.get(key).add(strs[i]);
        }
        for(List<String> list : map.values()){        //   可以直接简写成
            result.add(new ArrayList<>(list));       //        ||
        }                                           //         \/
        return result;                             //    return new ArrayList<>(map.values);
    }
}

原文地址:https://www.cnblogs.com/liuliu5151/p/11509800.html

时间: 2024-10-12 09:54:31

[虚拟机OA]Group Anagram 变位词归类的相关文章

[leetcode]49. Group Anagrams变位词归类

Given an array of strings, group anagrams together. Example: Input: ["eat", "tea", "tan", "ate", "nat", "bat"], Output: [ ["ate","eat","tea"], ["nat","

变位词的查找(下)

本文也同步发表在我的公众号"我的天空" 实现方案优劣的思考 之前我们的实现方案的优点是一旦目标词库的签名建立后,则变位词的查找会变得简单而快速:缺点是由于在生成目标词库时,要为每个词都生成签名,导致生成词库的时间会变慢,同时会消耗空间.对于那些没有被查找到的字符串的签名实际上是浪费的. 测试结果:在CPU为Inter Core i3-2328M,内存为6GB的PC上生成数量为1万的目标词库平均时间为377毫秒,查找变位词的平均时间为11毫秒.   第二种方案 在生成目标词库的时候并不生

每日一程-19.检查输入的两个词是否构成变位词

Author: Notus(hehe_xiao@qq.com) Create: 2019-02-26 Update: 2019-02-26 检查输入的两个词是否构成变位词 环境 Python version: 3.7.1 代码如下(a.py) ''' 检查输入的两个词是否构成变位词, 即字母相同,顺序不同. @Author: Notus(hehe_xiao@qq.com) @Create: 2019-02-26 @Update: 2019-02-26 @Version: 0.1 ''' def

写一个函数对字符串数组排序,使所有变位词都相邻

题目 写一个函数对字符串数组排序,使得所有的变位词都相邻. 解答 首先,要弄清楚什么是变位词.变位词就是组成的字母相同,但顺序不一样的单词. 比如说:live和evil就是一对变位词.OK,那么这道题目的意思就很清楚了, 它并不要求我们将字符串数组中的字符串按字典序排序,否则我们直接调用STL中的sort 函数就可以了.它要求我们在排序的过程中,按照变位词的准则来排序. 这种情况下,我们还是可以调用sort函数,不过要自己写一个对比函数. 一般情况下我们如果要排序一个长度为n的数组A,我们可以这

005推断两个字符串是否是变位词 (keep it up)

写一个函数推断两个字符串是否是变位词. 变位词(anagrams)指的是组成两个单词的字符同样,但位置不同的单词.比方说, abbcd和abcdb就是一对变位词 这也是简单的题. 我们能够排序然后对照, 也能够直接统计字符出现的个数来推断.这里给出统计字符来推断的代码: bool isAnagram1(const string& vLeft, const string& vRight) { if (vLeft.size() != vRight.size()) return false; i

变位词的查找(上)

本文也同步发表在我的公众号"我的天空" 这次我们聊一个比较有意思的话题:变位词的查找,这个话题在<编程珠玑>中出现,此书很经典,偏向于算法,大家如果能通读的话,肯定受益匪浅!   什么是变位词 不同的单词,如果其组成的字母相同的话,那么这些单词就互为变位词,譬如pots.stop. tops这三个单词就是互为变位词,都是由字母p.o.t.s组成,但是"pot" 就不与上述单词互为变位词,其缺少字母s,"potss"也不是,其多了一个字

互为变位词

// 判断两个单词是否互为变位词: 如果两个单词中的字母相同,并且每个字母出现的次数也相同, 那么这两个单词互为变位词 #include <stdio.h> #include <string.h> int is_anagram(char *s1, char *s2) // 判断两个数是否互为变位词, 若是返回1 { if(strlen(s1) != strlen(s2)) return 0; int count[256] = {0}; char *p; p = s1; while(

CareerCup之1.4判断字符串是否为变位词

[题目] 原文: 1.4 Write a method to decide if two strings are anagrams or not. 译文: 写一个函数判断两个字符串是否是变位词. [分析] 变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词.比如说, abbcd和abcdb就是一对变位词.该题目有两种思路: [思路一] 由于变位词只是字母的顺序改变,字符长度,字符种类没有改变,所以根据此我们只要重新根据字典序排序一下,两个字符串也就一样了. The eyes

变位词排序

题目描述 请编写一个方法,对一个字符串数组进行排序,将所有变位词合并,保留其字典序最小的一个串.这里的变位词指变换其字母顺序所构成的新的词或短语.例如"triangle"和"integral"就是变位词. 给定一个string的数组str和数组大小int n,请返回排序合并后的数组.保证字符串串长小于等于20,数组大小小于等于300. 测试样例: ["ab","ba","abc","cba&quo