题目描述:
编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。 字母 表中共有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;
}
这是本人第一次在优快云做题,感觉题目并没有很新颖,包括后面的两道dp题(青蛙过河是有一定的难度的,最大连续字段和的下标只需要在线性dp的模板上稍作修改即可),但是做题的过程,对我们的coding能力肯定也是有帮助的。
感谢观看,如果有错误或者其他的问题,欢迎评论区留言。