ZJYYOJ 活字印刷(dfs)[C,C++]

题目及翻译

题面

活字印刷术是中国古代四大发明之一,今天我们要试着用计算机实现一个“活字印刷术”。现在输入一个字符串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;
}

本文作者 CSDN@扶她小藜
个人主页链接 https://blog.csdn.net/weixin_44579869

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值