Leetcode 49. Group Anagrams (242.Valid Anagram)
2016-04-07 21:32
411 查看
valid Anagram
Given two strings s and t, write a function to determine if t is an anagram of s.
For example,
s = "anagram", t = "nagaram", return true.
s = "rat", t = "car", return false.
Note:
You may assume the string contains only lowercase alphabets.
Follow up:
What if the inputs contain unicode characters? How would you adapt your solution to such case?
Anagram group
这个题目要更复杂一些,需要比较多个字符串,并进行分类排序。
Given an array of strings, group anagrams together.
For example, given:
Return:
Note:
For the return value, each inner list's elements must follow the lexicographic order.
All inputs will be in lower-case.
1、使用sort函数将每个单词进行排序。 O( N*log(m))
2、然后遍历这个字符串数组,申请一个一维整型数组,将相同的单词编上相同的数字。 O(1)
3、申请一个二维数组 vector<vector<string>>把相同编号的单词放到同一个一维数组中。 O(N*logN)
4、对每一个一维数组进行排序。最终返回结果。 O(N)~O(logN)
时间复杂度分析:sort函数采用快速排序实现,假设n个单词,每个单词m个字母。m比较小,n比较大。
从上面的分析可知,2.遍历数组过程中判断某个单词是新单词还是以前出现过的耗时最长。
改进解法:
使用unordered_map结构来实现单词分类。上述过程改进为
1、使用sort函数将每个单词进行排序。 O( N*log(m))
2、key值保存排完序的单词,value为字符串数组。
3、对每个单词排序 O(log(N))
Given two strings s and t, write a function to determine if t is an anagram of s.
For example,
s = "anagram", t = "nagaram", return true.
s = "rat", t = "car", return false.
Note:
You may assume the string contains only lowercase alphabets.
Follow up:
What if the inputs contain unicode characters? How would you adapt your solution to such case?
1、题目分析
解法一:使用一个数组,将a-z这26个字母的出现情况保存下来。第一个字符串出现的单词加一,第二个字符串出现的单词减一。最后保存26的字母的数组为全0,则两个字符串相等。class Solution { public: bool isAnagram(string s, string t) { if(s.size()!=t.size()){ return false; } vector<int> flag(26,0); for(int i = 0;i<s.size();i++){ flag[s[i]%26]++; flag[t[i]%26]--; } for(int i = 0;i<26;i++){ if(flag[i]!=0){ return false; } } return true; } };
Anagram group
这个题目要更复杂一些,需要比较多个字符串,并进行分类排序。
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:
For the return value, each inner list's elements must follow the lexicographic order.
All inputs will be in lower-case.
1、题目分析
超时解法:1、使用sort函数将每个单词进行排序。 O( N*log(m))
2、然后遍历这个字符串数组,申请一个一维整型数组,将相同的单词编上相同的数字。 O(1)
3、申请一个二维数组 vector<vector<string>>把相同编号的单词放到同一个一维数组中。 O(N*logN)
4、对每一个一维数组进行排序。最终返回结果。 O(N)~O(logN)
时间复杂度分析:sort函数采用快速排序实现,假设n个单词,每个单词m个字母。m比较小,n比较大。
从上面的分析可知,2.遍历数组过程中判断某个单词是新单词还是以前出现过的耗时最长。
class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { int num = strs.size(); vector<string> strscopy; vector<string> resultLine; vector<string> temp; vector<int> flag(strs.size(),-1); strscopy.assign(strs.begin(),strs.end()); //对每个单词排序 for(int i = 0;i<num;i++){ sort (strs[i].begin(), strs[i].end()); } //sort(strs.begin(),strs.end()); //使用temp记录相同的元素大类,使用flag记录每个单词摆放的位置。O(m*n) for(int i = 0;i<num;i++){ int tag = -1; int j; for(j = 0;j<temp.size();j++){ if(strs[i]==temp[j]){ tag = j; } } if(tag!=-1){ flag[i] = tag; }else{ temp.push_back(strs[i]); flag[i] = temp.size()-1; } tag = -1; } vector<vector<string>> result(temp.size(),resultLine); //O(n) for(int i = 0;i<strs.size();i++){ result[flag[i]].push_back(strscopy[i]); } //O(m)*O(sort) for(int i = 0;i<result.size();i++){ sort(result[i].begin(),result[i].end()); } return result; } };
改进解法:
使用unordered_map结构来实现单词分类。上述过程改进为
1、使用sort函数将每个单词进行排序。 O( N*log(m))
2、key值保存排完序的单词,value为字符串数组。
3、对每个单词排序 O(log(N))
vector<vector<string>> result; unordered_map<string, vector<string>> hashmap; //使用sort函数对每个单词排序 for(const auto& i : strs){ string s = i; sort(s.begin(), s.end()); //使用map结构进行保存 hashmap[s].push_back(i); } for(const auto& i : hashmap){ //i.second表示hashmap的value值 vector<string> s = i.second; sort(s.begin(), s.end()); result.push_back(s); } return result;
相关文章推荐
- Qt5 编程基础
- CCF-201512-2 消除类游戏(模拟)
- 并查集初学——吸血鬼
- CentOs下软件的安装
- CentOs下软件的安装
- 数据结构(7):树的存储结构
- 排列的递归和非递归版本
- 《世界是数字的》读后感
- EventLoop
- Hibernate实体关系映射—Annotation
- 关于初学者上传文件到github的方法
- IOS中UITableViewCell使用详解
- 67. Add Binary
- android工具库
- 轻松学习之 IMP指针的作用
- 简单Python3爬虫程序(3)进阶:登录、解压缩、cookies
- poj1852ants
- 自己实现android侧滑菜单
- Collections.sort()及map.Entry<>用法
- c#泛型约束