CSDN竞赛第40期第二题编码题解——dfs

题目描述

编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。 字母 表中共有26个字母{a,b,…,z},这些特殊的单词长度不超过6且字母按升序排列。把所有这样的长度相同的单词放在 一起,按字典顺序排列,一个单词的编码就对应着它在整个序列中的位置。 你的任务就是对于所给的单词,求出它的编码。

如:ab的编码为27(a为1,b为2...以此类推)

思路:

第一眼看见题目数据范围——长度不超过6,哈,对于一个暴力型选手(bushi)来说,脑海就闪过一个念头——无脑搜索就完事儿,毕竟dfs模板固定,不费脑子,所以不到10分钟无脑敲了个dfs,然后就快乐ac了,当然感觉应该有更简单的方法,欢迎评论交流学习。

代码:

题干要求要先判断是不是满足升序字母的单词,所以我们事先用judge函数来判断是否满足条件,如果不满足则直接输出0然后return就行啦,满足就从长度为1开始,一直到输出的字母的长度,不断进行搜索与计数,知道与目标字符串匹配为止。

本题采用char 数组来存入字符串,根据个人习惯用其他如string,vector进行操作当然也是可以的

#include<bits/stdc++.h>
using namespace std;
int len;
char res[10];    //res数组用来实时存当前搜索到的字符串
int cnt=0,ans=0;    //cnt用来计数,ans则为最后的结果
char s[10];
void dfs(int y,int x)  //深度优先搜索
{
	if(x>y)
	{
		cnt++;
		if(y!=len) return;    //如果当前搜索到的字符串与目标字符串长度不同,自然不需要进行比较
		int flag=0;
		for(int i=0;i<len;i++)
		{
			if(s[i]!=res[i+1])
			{
				flag=1;
				break;
			}
		}
		if(flag==0) ans=cnt;    //如果匹配成功,对ans赋值
		return;
	}
	for(int i=0;i<26;i++)
	{
		if('a'+i>res[x-1]||x==1)
		{
			res[x]='a'+i;
			dfs(y,x+1);
		}
		if(ans!=0) return;
	}
}
int judge(char s[])    //判断字符串是否满足升序条件
{
	int len1=strlen(s);
	for(int i=1;i<len1;i++)
	{
		if(s[i]-'0'<=s[i-1]-'0')
		return 0;
	}
	return 1;
}
int main()
{
	cin>>s;
	if(!judge(s))
	{
		cout<<"0"<<endl;
		return 0;
	}
	len=strlen(s);
	for(int i=1;i<=len;i++)
	{
		dfs(i,1);    //从长度为1的字符串开始搜索计数
	}
	cout<<ans<<endl;
	return 0;
}

这是本人第一次在CSDN做题,感觉题目并没有很新颖,包括后面的两道dp题(青蛙过河是有一定的难度的,最大连续字段和的下标只需要在线性dp的模板上稍作修改即可),但是做题的过程,对我们的coding能力肯定也是有帮助的。

感谢观看,如果有错误或者其他的问题,欢迎评论区留言。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值