编程题a ~ y的25个字母,从1位到4位的编码,输出这个编码对应的Index - Go语言中文社区

编程题a ~ y的25个字母,从1位到4位的编码,输出这个编码对应的Index


假定一种编码的编码范围是a-y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下:
a,aa,aaa,aaaa,aaab,aaac,…,…,b,ba,baa,baaa,baab,baac,… …,yyyw,yyyx,yyyy
其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。
编写一个函数,输入是任意一个编码,输出这个编码对应的index,如:
输入:baca
输出:16328
题目分析
如果你之前做过另一个题目,“求字符的所有组合,当输入的字符串中含有相同的字符串时,相同的字符交换位置是不同的排列,但是同一个组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。” 那么这个题目一出来起码不会觉得特别无从下手,其实就算没做过也不会特别无从下手,因为就是穷举利器嘛(即使写成漂亮的递归,仍然不能摆脱穷举的命运)。
这里自然不是为了分析这个递归穷举法(也许之后我会再单独写一篇阐述一下下)。所以技巧还是需要一些的。将题目要求的字符串排列组合起来,如下图示
在这里插入图片描述
根据排列组合的原理,单独来看每一位字符其可能的组合都是,把4位结合起来看,从第1位到第4位,其可能的排列组合分别是pn1p^1_n

先来看最末位,即字符串有4位,前3为相同,只有最后一位不同,那么index = index‘+(*p-*p’)。举个例子
p’ 是指向字符串aaaa的最后一位a的指针,p是指向字符串aaab的最后一位b的指针,那么aaab的index就等于aaaa的index‘加上字符b与字符a的距离(即’b‘-’a’)

接下来看倒数第二位,即前2位和最后1位相同,只有倒数第2位不同,那么index = index’ +(*p-p’)( pn1p^1_n

最后就是首位了,即第1位不同,后面的3位相同,那么。举个例子
p’ 是指向字符串aaaa的第3位a的指针,p是指向字符串baaa的指针,那么按排列规则,aaaa与baaa之间应该有字符串aaab,aaac,…aaay, aab,aaba…aaby…ab,aba,abaa,…abyy, ay,aya,ayaa…ayyy,b,ba,baa,再加上aaaa自身,这一系列字符串正好是一个完整的pn1pn1pn1+pn1pn1+pn1p^1_n * p^1_n*p^1_n +p^1_n *p^1_n +p^1_n

综上,mnoq相对于字符串a的index应该是

在这里插入图片描述
分析完毕。输入index反向查找字符串正好是将上面的分析过程反过来,这里不详细记述。

//输入字符串输出index
#include<iostream>
using namespace std;
int main()
{
	int num=25;
	string p;
	cin>>p;
	int n=3;
	int index=0;
	int sum[4]={1};
	for(int i=1;i<4;i++)
	{
		sum[i]=num*sum[i-1]+1;
	}
	for(int i=0;i<p.length();i++)
	{
		index=index+(p[i]-'a')*sum[n--];
	}
	cout<<index;
}
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/summer2day/article/details/88384915
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-28 01:30:39
  • 阅读 ( 764 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢