【LeetCode】49. Anagrams (2 solutions)
Anagrams
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
首先解释一下什么是anagrams:在不考虑顺序的情况下,包含相同字母的字符串组成anagrams
例如:
1、{"eat","ate","tea","coffee"}的anagrams是{"eat","ate","tea"}
2、{"tea","and","ate","eat","dan"}的anagrams是{"tea","ate","eat","and","dan"}
解法一:排序之后的string作为key
在具体实现过程中,构造了两张映射表dict和exist
dict用来对排序过的单词进行快速查找,值(value)为第一个该编码的单词下标。
exist用来记录该排序过的单词是否已存在anagrams中,
如果是,只需要将当前单词装入anagrams;
如果不是,首先要将存放在m中的代表该排序过的单词的第一个单词装入anagrams,再装入当前单词。
class Solution {
public:
    vector<string> anagrams(vector<string> &strs) {
        vector<string> ret;
        unordered_map<string, int> dict;
        unordered_map<string, bool> exist;
        for(int i = ; i < strs.size(); i ++)
        {
            string temp = strs[i];
            sort(temp.begin(), temp.end());
            if(dict.find(temp) == dict.end())
                dict[temp] = i;
            else
            {//find anagrams
                if(exist[strs[dict[temp]]] == false)
                {
                    ret.push_back(strs[dict[temp]]);
                    exist[strs[dict[temp]]] = true;
                }
                ret.push_back(strs[i]);
                exist[strs[i]] = true;
            }
        }
        return ret;
    }
};

解法二:利用质因数分解
背景:任何一个正整数都可以分解为唯一的质因数乘积:n=2a3b5c7d…
因此n可以用{a,b,c,d}来唯一表示。
对于这个题,我们对a~z每个单词的出现次数作为每个质因数的次幂,
将乘积进行唯一编码,就可以忽略字母顺序了。相同编码的单词组成anagrams。
因为共有小写字母26个,因此我们需要前26个质因数。
在具体实现过程中,我还构造了两张映射表m和exist
dict用来对编码进行快速查找,值(value)为第一个该编码的单词下标。
exist用来记录该编码是否已存在anagrams中,
如果是,只需要将当前单词装入anagrams;
如果不是,首先要将存放在dict中的代表该编码的第一个单词装入anagrams,再装入当前单词。
class Solution {
public:
    vector<string> anagrams(vector<string> &strs) {
        vector<string> ret;
        vector<long long int> code(strs.size(), );
        CalCode(strs, code);
        map<long long int, int> dict;
        map<string, bool> exist;
        for(int i = ; i < strs.size(); i ++)
        {
            if(dict.find(code[i]) == dict.end())
                dict[code[i]] = i;
            else
            {
                if(exist[strs[dict[code[i]]]] == false)
                {
                    exist[strs[dict[code[i]]]] = true;
                    ret.push_back(strs[dict[code[i]]]);
                }
                exist[strs[i]] = true;
                ret.push_back(strs[i]);
            }
        }
        return ret;
    }
    void CalCode(vector<string> &strs, vector<long long int> &code)
    {
        for(int i = ; i < strs.size(); i ++)
        {
            string cur = strs[i];
            vector<int> count(, ); //a~z count
            for(int j = ; j < cur.size(); j ++)
            {
                count[cur[j]-'a'] ++;
            }
            double prime[] = {,,,,,,,,,,,,,,,,,,,,,,,,,};
            long long result = ;
            for(int j = ; j < ; j ++)
            {
               result *= (long long int)pow(prime[j], count[j]);
            }
            code[i] = result;
        }
    }
};

【LeetCode】49. Anagrams (2 solutions)的更多相关文章
- 【LeetCode】49. Group Anagrams 解题报告(Python & Java & C++)
		作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序+hash 日期 题目地址:https://le ... 
- 【LeetCode】49. Group Anagrams
		题目: Given an array of strings, group anagrams together. For example, given: ["eat", " ... 
- 【LeetCode】49. 字母异位词分组
		49. 字母异位词分组 知识点:字符串:哈希表 题目描述 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源 ... 
- 【LeetCode】18. 4Sum (2 solutions)
		4Sum Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d ... 
- 【LeetCode】46. Permutations (2 solutions)
		Permutations Given a collection of numbers, return all possible permutations. For example,[1,2,3] ha ... 
- 【LeetCode】120. Triangle (3 solutions)
		Triangle Given a triangle, find the minimum path sum from top to bottom. Each step you may move to a ... 
- 【LeetCode】77. Combinations (2 solutions)
		Combinations Given two integers n and k, return all possible combinations of k numbers out of 1 ... ... 
- 【LeetCode】78. Subsets (2 solutions)
		Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset ... 
- 【LEETCODE】49、数组分类,简单级别,题目:566,1089
		package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ... 
随机推荐
- [Git]   谷歌的代码管理
			copy from : http://www.ruanyifeng.com/blog/2016/07/google-monolithic-source-repository.html https:// ... 
- JavaBean的应用
			1. 获取JavaBean属性信息 例1.1 在JSP页面中显示JavaBean属性信息. (1)创建名称为Produce的类,该类是封装商品对象的JavaBean,在Produce类中创建商品属性, ... 
- @Logback简介
			Ceki Gülcü在Java日志领域世界知名.他创造了Log4J,这个最早的Java日志框架即便在JRE内置日志功能的竞争下仍然非常流行.随后他又着手实现SLF4J这个"简单的日志前端接口 ... 
- Keras  Data augmentation(数据扩充)
			在深度学习中,我们经常需要用到一些技巧(比如将图片进行旋转,翻转等)来进行data augmentation, 来减少过拟合. 在本文中,我们将主要介绍如何用深度学习框架keras来自动的进行data ... 
- 任务栈 启动模式 Task Flag launchMode MD
			Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ... 
- 13个可实现超棒数据可视化效果的Javascript框架
			随着商业及其相关需求的发展,数据成为越来越重要的元素之一,为了更加直观和明显的展示商业潜在的趋势和内在的特性,我们需要使用图表和图形的方式来直观动态的展示数据内在秘密,在今天的这篇文章中我们推荐12款 ... 
- 【HBase】学习笔记
			HBASE 1 简介 1.1 官网 1.1.1 http://hbase.apache.org/ 1.1.2 Apache HBase™ is the Hadoop database, a distr ... 
- 【MySQL】MySQL-主从复制-集群方案-数据一致性问题解决方案     &&    MySQL备份的各种姿势
			1.写性能如何保证:分库分表 2.读性能如何保证:主从结构,实时备份 3.一致性问题怎么解决: 3.1.微博案例:Redis缓存,热数据查询走Redis,主从的延迟通过Redis消除 3.2.支付宝的 ... 
- Activiti Designer 5.14.1插件安装和使用
			1.离线包下载 离线安装包下载:https://files.cnblogs.com/files/modou/Activiti_BPMN_2.0_designer.rar 2.安装 先把jars文件夹中 ... 
- ubuntu server 安装 question2answer 及 汉化包
			ubuntu server 安装 question2answer 及 汉化包 question2answer 是一个非常简洁方便的问答系统,可以用它快速的部署一个问答社区,提高在开发中的交流沟通效率: ... 
