活字印刷。

news/2024/11/7 21:32:30/

题目描述

你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。

注意:本题中,每个活字字模只能使用一次。

示例 1:

输入:“AAB”
输出:8
解释:可能的序列为 “A”, “B”, “AA”, “AB”, “BA”, “AAB”, “ABA”, “BAA”。
示例 2:

输入:“AAABBC”
输出:188
示例 3:

输入:“V”
输出:1

提示:

1 <= tiles.length <= 7
tiles 由大写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/letter-tile-possibilities
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

动态规划
定义dp[i][j]表示前i种字符构成长度为j的字符串的序列的方案数
初始化dp[0][0]=1表示构成空字符串的方案数为1种
状态转移:
对于第i种字符我们可以不选它构成长度为j的字符串
此时dp[i][j]=dp[i-1][j]。
我们可以选择第i种字符来构成长度为j的字符串
其中第i种字符的总数量为cnt,那么我们可以选择k个第i种字符去构成长度为j的字符串,k属于[0,min(j,cnt)]。其中选0个等价于不选它,构成的字符串长度为j,而第i种字符最多有cnt个,所以最多可以选min(j,cnt)个第i种字符。
选择的这k个字符需要在长度为j的字符串中存在,则这k个字符在字符串中的位置方案一共有C[j,k]种。
C[j,k]指概率c公式是:C(n,k)=n(n-1)(n-2)(n-k+1)/k!
dp[i][j]+=dp[i-1][j-k]*C(j,k);
最终结果就是所有选取种类的字符构成长度为1,2…tiles.length的方案数总和。

代码

class Solution {public int numTilePossibilities(String tiles) {HashMap<Character,Integer> map=new HashMap<>();HashSet<Character> set=new HashSet<>();//统计字符出现的次数for(char c:tiles.toCharArray()){if(map.containsKey(c)==false){map.put(c,1);}else{map.put(c,map.get(c)+1);}set.add(c);}int m=set.size();int n=tiles.length();int[][] dp=new int[m+1][n+1];dp[0][0]=1;int i=1;for(char c:set){//选取前i种字符int cnt=map.get(c);//第i种字符的个数for(int j=0;j<=n;j++){//构成长度为j的字符串for(int k=0;k<=j && k<=cnt;k++){//状态转移,选取k个第i种字符dp[i][j]+=dp[i-1][j-k]*get(j,k);}}i++;}int ans = 0;for (int j = 1; j <= n; j++)ans += dp[m][j];return ans;}//C(j,k)=j(j-1)(j-2)(j-k+1)/k!public int get(int j,int k){int fenzi=1;int fenmu=1;for(int i=0;i<k;i++){fenzi*=(j-i);fenmu*=(k-i);}return fenzi/fenmu;}
}

ps:如果看不太明白推荐大家看灵神的解答
链接: link


http://www.ppmy.cn/news/74414.html

相关文章

2023-5-22第二十二天

回家一天&#xff0c;单词学习了但是没有记载 intergrate合并&#xff0c;整合 applied应用的&#xff0c;实用的 explicit明确的 modifier修饰语 customize定制 partition隔板&#xff0c;分隔&#xff0c;分裂 potentially潜在的 subset子集&#xff0c;分组&#xf…

ThreadLocal为什么容易内存泄露?

文章目录 一、Java的四种引用二、ThreadLocal为什么容易内存泄露&#xff1f;三、源码 一、Java的四种引用 1、强引用&#xff1a;强引用在程序内存不足&#xff08;OOM&#xff09;的时候也不会被回收 2、软引用&#xff1a;软引用在程序内存不足时&#xff0c;会被回收 3、弱…

日用行业外贸ERP软件系统,提高工作效率降低成本

日用行业是一个广泛的行业&#xff0c;包括了许多不同的产品&#xff0c;如家居用品、化妆品、个人护理用品、厨房用具等等。日用行业产品出口&#xff0c;也是我国传统外贸产业之一&#xff0c;在外贸市场来说相对有竞争力优势&#xff0c;在国际贸易中具有很大的需求和市场潜…

Android中的蓝牙技术

随着智能化生活的发展&#xff0c;手机成为人们生活的必需品&#xff0c;而蓝牙技术也随之应运而生。蓝牙技术作为现代移动设备与设备之间传输数据的一种主流方式&#xff0c;已经广泛应用于手表、耳机、车载系统等多种设备。在Android设备中&#xff0c;蓝牙技术也被大量使用&…

MATLAB画图相关操作

axis([x_min,x_max,y_min,y_max]) %设置坐标轴范围 set(gca,‘XTick’,[-1:0.2:1]) % 设置坐标刻度 xlabel(‘x轴数据’); ylabel(‘y轴数据’); title(‘标题’); legend(‘图例1’,‘图例2’) % 去掉图例边框 legend boxoff; % 法2 % 设置绘图外围颜色 set(gcf, ‘Colo…

vue的路由的原理(自己封装一个vue-router插件)

vue的路由的原理 前言&#xff1a;路由实例化&#xff1a;路由匹配&#xff1a;路由跳转&#xff1a;路由钩子&#xff1a;插件调用install方法封装RouterView封装RuoterLink详细步骤main.js\src\router\index.js\src\plugins\router.js\src\plugins\components\RouterView.js\…

八.异常控制流ECF

异常 类别原因异步/同步返回行为示意图中断来自IO设备的信号异步下一条指令陷阱有意的异常同步下一条指令&#xff0c;如syscall(系统调用)故障潜在可恢复的错误同步可能返回到当前指令终止不可恢复的错误同步不会返回 故障中的“除法错误”、“一般保护故障”会直接终止&…

用Powerpoint (PPT)制作并导出矢量图、高分辨率图

论文写作时经常需要导入矢量图&#xff0c;正规军都是用AI或者Inkscape作图&#xff0c;但是PPT更加适合小白用户&#xff0c;或者一些简单的构图需求使用PPT更加便捷&#xff0c;而且不得不承认PPT的某些功能是真的香&#xff0c;例如&#xff1a;简单的对齐、文字插入和格式修…