[leetcode] Anagrams

Anagrams

Given an array of strings, return all groups of strings that are anagrams.

Note: All inputs will be in lower-case.

思路:

什么是anagrams?傻逼了,百度吧。一百度全是别人的方法,看到了有map存在,正是这个提示导致此题并没有用很长的时间。

方法很简单,将vector中的每个string先排序,然后在map中寻找是否已经有排序后的string,如果有则说明找到了一个anagrams,如果没有则把排序后的string作为key存在map中,对应的value就是它在vector中的序号,方便以后的比较。有一个难点就是如果找到了一个anagrams,不仅需要把存储本次的string,还需要存储一次key对应的value在排序前的string。

有两种方法,一种是如果在map中第一次找到,就把value在排序前的string存下来,同时使得这个value为负数。这样,只需要判断key对应的value是否大于等于0,如果小于0说明之前已经存储过排序前的value。还有一种方法更直观,直接开个数组flag,如果map中的元素找到了,就将flag对应下标的元素+1,表明这一组anagram出现了多少次。这样在如果flag的某个下标大于0,就在容器中对应的位置插入排序之前的元素即可。第二种方法比较复杂,所以用的第一种方法实现的。

最终的方案将Eason Liu中的map改成了unordered_map,AC之后发现和他的方法完全一样。这就是提前看到答案的不好之处,哪怕是一丁点信息。

题解:

class Solution {
public:
    vector<string> anagrams(vector<string> &strs) {
        vector<string> res;
        string str;
        unordered_map<string, int> map;
        for(int i=0;i<strs.size();i++) {
            str = strs[i];
            sort(str.begin(), str.end());
            if(map.find(str)==map.end())
                map[str] = i;
            else {
                res.push_back(strs[i]);
                if(map[str]>=0) {
                    res.push_back(strs[map[str]]);
                    map[str] = -1;
                }
            }
        }
        return res;
    }
};

后话:

似乎还有一种更高大上的方法,其他的一样,只是map比较的Key变了,这种思路个人觉得很好,将出现的字符串变成26个字母出现的次数,可以有效避免标点符号和过长的string。详见此处例题1

时间: 2024-10-19 10:16:22

[leetcode] Anagrams的相关文章

[leetcode]Anagrams @ Python

原题地址:https://oj.leetcode.com/problems/anagrams/ 题意: Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. 解题思路:anagram的意思是:abc,bac,acb就是anagram.即同一段字符串的字母的不同排序.将这些都找出来.这里使用了哈希表,即Python中的dic

LeetCode: Anagrams [048]

Background Some concepts in Mathematics and Computer Science are simple in one or two dimensions but become more complex when extended to arbitrary dimensions. Consider solving differential equations in several dimensions and analyzing the topology o

LeetCode ---Anagrams() 详解

Notice: Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. For example: Input: ["tea","and","ate","eat","den"] Output:   ["tea",&qu

LeetCode——Anagrams

Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. 原题链接:https://oj.leetcode.com/problems/anagrams/ 易位构词游戏的英文词汇是 anagram,这个词来源于有"反向"或"再次"的含义的希腊语字根ana-和有"书写"."

[Leetcode] Anagrams 颠倒字母构成词

Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. 题意:anagrams的意思是回文构词法.回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序.如: Input: ["tea","and","ate","eat",&qu

[LeetCode] Anagrams 错位词

Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. http://www.cnblogs.com/AnnieKim/archive/2013/04/25/3041982.html http://bangbingsyb.blogspot.com/2014/11/leetcode-anagrams.html

LeetCode: Anagrams 题解

Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. 题解: 判断字符串是否为回文构词法生成的.找出所有由同一回文构词法生成的字符串对. 使用map用于散列. 将strs中的字符串strs[i],在串内进行字典排序,生成key,原始s[i]不变. 将该字符串s[i]映射到key所对应位置.map[key].push_bac

Leetcode:Anagrams 回文构词法

戳我去解题 Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. Anagram(回文构词法)是指打乱字母顺序从而得到新的单词 回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序.因此,将几个单词按照字母顺序排序后,若它们相等,则它们属于同一组anagrams class Solution {

LeetCode Anagrams My solution

Anagrams Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. 我的解题思路是这种:1.事实上所谓的anagrams就是字母同样就ok了 2.把每一个数组里面的数字以字典序进行又一次排序形成fingerprint 3.推断排序过得串是否在hashmap里面,假设在里面就加一,说明这个fingerprint 有了 有