/*
题目描述:
给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串.
示例 1:
Input:["eat", "tea", "tan", "ate", "nat", "bat"]
Output:[["ate","eat","tea"],["nat","tan"],["bat"]]
所有输入均为小写字母.不考虑答案输出的顺序.
*/
解法1:
- 利用哈希表查找,构造一个哈希表,一个比较简单的思路是用26个字母的ASCII值,把字符串的各个字母,这样可保证字母异位词的乘积必定相等的.则可以通过比较乘积判断字符串是否相同.
Go语言实现
package main
import "fmt"
func groupAnagrams(letters []string)(list [][]string){
dictionary:=map[byte]int{'a':2,'b':3,'c':5,'d':7,'e':11,'f':13,'g':17,'h':19,
'i':23,'j':29,'k':31,'l':37,'m':41,'n':43,'0':47,'p':53,'q':59,'r':61,'s':67,'t':71,
'u':73,'v':79,'w':83,'x':89,'y':97,'z':101}
hash:=make(map[int][]string)
for _,letter:=range letters{
m:=1
for i:=0;i<len(letter);i++{
m*=dictionary[letter[i]]
}
if hash[m]==nil{
hash[m]=[]string{}
}
hash[m]=append(hash[m],letter)
}
for _,value:=range hash{
list=append(list,value)
}
return
}
func main(){
fmt.Println("求字母异位词分组")
letters:=[]string{"eat", "tea", "tan", "ate", "nat", "bat"}
fmt.Println(groupAnagrams(letters))
}
解法2:
- 利用key-value键值对,然后把错位词的字符顺序重新排列,这样就可以得到相同的结果,因此重新排序是判断是否互为错位词的方法,由于错位词重新排序后都会得到相同的字符串,所以可以以此为key,将所有错位词都保存到字符串数组中,建立key和字符串数组的映射,最后再存入结果reuslt中即可.
C++语言实现
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
class Solution{
public:
Solution(vector<string>& _strs):strs(_strs){}
vector<vector<string>> groupAnagramrams(){
vector<vector<string>> result;
unordered_map<string,vector<string>> dictionary;
for(auto& str:strs){
string temp=str;
sort(temp.begin(),temp.end());
dictionary[temp].push_back(str);
}
for(auto& value:dictionary){
result.push_back(value.second);
}
return result;
}
private:
vector<string> strs;
};
int main(int argc,char* argv[]){
vector<string> strs={"eat", "tea", "tan", "ate", "nat", "bat"};
vector<vector<string>> result=Solution(strs).groupAnagramrams();
for_each(result.begin(),result.end(),[](vector<string>& m){
for(auto& str:m)
cout<<str<<" ";
cout<<endl;
});
return 0;
}