给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
解题分析:
本题我们暂且先用python来解决。首先认真解读题目意思我们可以发现,在同一组的字母异位词中,全部的单词出现的次数是一样的。那我们就可以用一种方式去标记这组词,比如说我们先写一个质数筛的算法,得到前26个质数,然后把'a'~'z'这26个字母映射到26个质数上面,然后,我们利用python本身就带有大整数计算的性质,去计算每一个字符串所代表的数字,由质数分解定理我们可以知道同一组字母异位词的每一个单词所代表的大整数是一样的,所以我们创建一个map,首先检查这组字母异位词的代表的大整数是否出现过,如果没有,我们直接创建一个key,对应的value为一个空list,然后把这个单词append到list中,如果有就直接append即可,最后得出答案。返回keys中的list[str]即可。
代码实现
1.质数筛:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
// #include <iomanip>
#include <map>
#include <stack>
#include <list>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <sstream>
#define INF (1<<30)
using namespace std;
void sieveOfPrime(int N){
vector<bool> sieve(N+1,true);
sieve[0]=sieve[1]=false;
for(int p=2;p*p<=N;p++){
if(sieve[p]){
for(int i=p*p;i<=N;i+=p){
sieve[i]=false;
}
}
}
for(int i=2;i<=N;i++){
if(sieve[i]){
cout<<i<<" "<<endl;
}
}
}
int main(){
int N;
scanf("%d",&N);
sieveOfPrime(N);
return 0;
}
2.异位词分组
def groupNumber(strs :list[str])->list[list[str]]:
map = {'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, 'o':47, 'p':53, 'q':59,
'r':61, 's':67, 't':71, 'u':73,
'v':79, 'w':83, 'x':89, 'y':97,'z':101}
resmap = {}
for str in strs:
m = 1
for i in range(len(str)):
m *= map[str[i]]
if m not in resmap:
resmap[m] = []
resmap[m].append(str)
return [ j for j in resmap.values()]