[leetcode] 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 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()]

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值