49. Group Anagrams

来源:互联网 发布:string数组去掉空格 编辑:程序博客网 时间:2024/05/01 23:09

题目:

Given an array of strings, group anagrams together.

For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
Return:

[  ["ate", "eat","tea"],  ["nat","tan"],  ["bat"]]

Note:

  1. For the return value, each inner list's elements must follow the lexicographic order.
  2. All inputs will be in lower-case.


题意:

给定一个字符串数组,将相同字符的字符串分组。

note:

1、对于结果集,每一个内部集合元素都必须遵循字典顺序;

2、所有的输入集合都是小写字符;


思路:

先将输入字符串数组排序,按照字典顺序排序。之后将每个小字符串分解成字符数组之后,同样按照字典顺序排序之后作为map集合的键,将具有相同元素的字符串放到同一集合中,最后将map中的值转化为输出集。

代码:java版:34ms

public class Solution {    public List<List<String>> groupAnagrams(String[] strs) {        if(strs==null || strs.length==0){            return new ArrayList<List<String>>();        }        Map<String, List<String>> map = new HashMap<String, List<String>>();        Arrays.sort(strs); //确定字典顺序        for(String s : strs){            char[] ca = s.toCharArray();  //将每一个字符串转换成字符数组            Arrays.sort(ca);  //对字符数组排序            String keyStr = String.valueOf(ca); //将排序后的字符数组转换成字符串            if(!map.containsKey(keyStr)){  //如果map集合中没有该字符串,则添加新建一个                map.put(keyStr, new ArrayList<String>());            }            map.get(keyStr).add(s);  //将原字符串加入到对应的具有相同元素的map中        }        return new ArrayList<List<String>>(map.values());    }}
C++版:82ms

class Solution {public:    vector<vector<string>> groupAnagrams(vector<string>& strs) {                unordered_map<string, multiset<string>> mapping;        for(string str : strs){ //利用具有相同元素的字符串排序后作为键,具有相同字符的字符串作为值            string s = str;            sort(s.begin(), s.end());            mapping[s].insert(str);        }                vector<vector<string>> result;        for(auto map : mapping){ //将拥有相同元素的字符串按照字符顺序排序,并存储进结果集中            vector<string> anagram(map.second.begin(), map.second.end());            result.push_back(anagram);        }        return result;    }};


0 0
原创粉丝点击