题目及翻译
题面
活字印刷术是中国古代四大发明之一,今天我们要试着用计算机实现一个“活字印刷术”。现在输入一个字符串s,代表一套活字字模,其中每个字模上都刻有一个字母 s[i]。输出你可以印出的非空字母序列的数目。
输入
输入数据由多组测试数据组成。每组测试数据第一行输入一个字符串s ( 1 <= s.length <= 10 ),s中所有字母均为大写字母
输出
输出可以印出的非空字母序列数目
输入样例
AAB
输出样例
8
提示
样例可能的序列为:
“A”, “B”, “AA”, “AB”, “BA”, “AAB”, “ABA”, “BAA”。
题目思路
给学弟学妹写篇题解,小不点们加油!!
有不懂的地方欢迎留言或者微信找我询问~
一直算不出样例的小伙伴可能没搞清楚题意
这题的题目是活字印刷,字符串给出的唯一作用是告诉你每个字符有多少个
本质上只要求所有字符能组合出来的子串数量就行,与原字符串的顺序无关
理解题目意思这题就很简单了,统计一下每个字的数量,然后dfs只要选择使用这个字或者不用
注意事项
最大的坑点是活字印刷,但是可以分析样例得知
printf的时候忘记加\n的话会wa,没错我wa在这里了
AC代码
C/C++(几乎没有代码变更)
用时12MS 内存2028K 长度788B
#include<stdio.h>
#include<string.h>//memset所在头文件
char str[20];//用于输入字符串
int cnt[26];//用于统计字母数量
int dfs(){
int res = 0;
for(int i=0;i<26;++i){//遍历所有字母
if(cnt[i] == 0)continue;//如果这个字母用完了就跳过
++res;//当前情况可行,就增加1答案
--cnt[i];//使用一个当前字母
res += dfs();//统计剩下的字母2所组成的可能
++cnt[i];//回溯
}
return res;
}
int main(){
while(~scanf("%s",str)){//循环输入到文件尾
memset(cnt,0,sizeof(cnt));//清空统计数组
for(int i=0;i<strlen(str);++i){//哈希统计每个字母的数量
++cnt[str[i]-'A'];//str[i] - 'A' 可计算出每个字母对应的位置
}
printf("%d\n",dfs());
}
return 0;
}
本文作者 优快云@扶她小藜
个人主页链接 https://blog.youkuaiyun.com/weixin_44579869