活字印刷

题目描述

活字印刷术是中国古代四大发明之一,今天我们要试着用计算机实现一个“活字印刷术”。现在输入一个字符串s,代表一套活字字模,其中每个字模上都刻有一个字母 s[i]。输出你可以印出的非空字母序列的数目。
输入

输入数据由多组测试数据组成。每组测试数据第一行输入一个字符串s ( 1 <= s.length <= 10 ),s中所有字母均为大写字母
输出

输出可以印出的非空字母序列数目
样例输入 Copy

AAB
样例输出 Copy

8
提示

对于样例:
可能的序列为 “A”, “B”, “AA”, “AB”, “BA”, “AAB”, “ABA”, “BAA”。

思路

当字母还没用完的时候,拿一个来用,可用情况加一,个数减一
字母用完时拿其他还有的
在这里插入图片描述

代码

#include<bits/stdc++.h>
using namespace std;
int ans=0;
int a[100];
int len;
void dfs(int chang){
	if(chang==len){// 当计算到最后一个字母时,只剩下一种情况
		ans++;
		return;
	}
	for(int i=0;i<=26;i++){//遍历A-Z 计算分支
		if(a[i]==0){//没有字母时跳过
			continue;
		}
		ans++;//否则情况加一
		a[i]--;//字母数减一
		dfs(chang+1);//计算次数加一
		a[i]++;//回溯
	}
}
int main()
{
	string s;
	while(cin>>s){
		memset(a,0,sizeof(a));
		for(int i=0;i<s.length();i++){
			a[s[i]-'A']+=1;
		}
		len=s.length();
		ans=0;
		dfs(1);
		cout<<ans<<endl;
	}
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值