• 0049. Group Anagrams (M)


    Group Anagrams (M)

    题目

    Given an array of strings, group anagrams together.

    Example:

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

    Note:

    • All inputs will be in lowercase.
    • The order of your output does not matter.

    题意

    给定一个字符串数组,将由相同字符集合组成的字符串进行分组。

    思路

    如果两个字符串由相同字符集合组成,说明两个字符串含有的字母种类相同,且每种字母的个数相同。可以用一个26位长度的串来作为指定字符串的hashCode,每一位上的数字字符代表对应字母在字符串中出现的个数,问题就转化为了根据hashCode来对字符串进行分组。

    同样也可以将字符串各字符按照字典序重新排序后得到的字符串作为hashCode。


    代码实现

    Java

    class Solution {
        public List<List<String>> groupAnagrams(String[] strs) {
            List<List<String>> ans = new ArrayList<>();
            Map<String, List<String>> map = new HashMap<>();
            for (int i = 0; i < strs.length; i++) {
                String hashCode = hash(strs[i]);
                if (map.containsKey(hashCode)) {
                    map.get(hashCode).add(strs[i]);
                } else {
                    List<String> list = new ArrayList<>();
                    list.add(strs[i]);
                    map.put(hashCode, list);
                }
            }
            for (String s : map.keySet()) {
                ans.add(map.get(s));
            }
            return ans;
        }
    
        // 第一种hash,以个数统计字符串作为hashCode
        private String hash(String s) {
            int[] alphabet = new int[26];
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                alphabet[c - 'a']++;
            }
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 26; i++) {
                sb.append((char) (alphabet[i] + '0'));
            }
            return sb.toString();
        }
        
    	// 第二种hash,以字典序正序字符串作为hashCode
        private String hash(String s) {
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            return String.valueOf(chars);
        }
    }
    

    JavaScript

    /**
     * @param {string[]} strs
     * @return {string[][]}
     */
    var groupAnagrams = function (strs) {
      let lists = []
      let map = new Map()
      for (let s of strs) {
        let t = s.split('').sort().join('')
        if (!map.has(t)) {
          map.set(t, [])
        }
        map.get(t).push(s)
      }
      for (let list of map.values()) {
        lists.push(list)
      }
      return lists
    }
    
  • 相关阅读:
    php 处理 json_encode 中文显示问题
    php输出cvs文件,下载cvs文件
    php服务器端生成csv文件
    在VS2013中强制IIS Express应用程序池使用经典模式
    align=absMiddle属性设置
    30个惊人的插件来扩展 Twitter Bootstrap
    jquery.fullCalendar官方文档翻译(一款小巧好用的日程管理日历, 可集成Google Calendar)
    jquery操作select(取值,设置选中)
    Bootstrap Paginator 分页 demo.
    uniform 中checkbox通过jquery 选中
  • 原文地址:https://www.cnblogs.com/mapoos/p/13217097.html
Copyright © 2020-2023  润新知