先对我们要解决的问题进行一个描述:
如上图所示,原来有个字符串”123”,现在有个对应关系,可以把1换成”A”,”a”,”甲”,可以把2换成”B”,”b”,可以把3换成”C”,那么,有多少种组合字符串的方式呢(注意顺序不变),我们可以计算得到4*3*2 = 24种组合方式(包括原字符串”123”在内)。我们用0~23这24个数字来给所有组合的字符串编号,如何根据0~23这24个数字,再反过来推出每个数字是对应的哪个字符串呢?下面,详细说一下方法。
根据上面的描述,我们有以下一直条件:
1.1对应的替换字符是”A”, “a”, “甲”
2.字符串”123”的顺序不能改变,也就说,只能替换出来”A2C”这样的字符串,不能替换出来”2AC”这样的字符串。
3.对于第一位的字符,”1”, “A”, “a”,”甲”的顺序也是固定的,比如第一位的index为0的字符是”1”,index为1的字符代表”A”, index为2的代表”a”, index为3的代表字符”甲”。
详细思路如下:
对于上面这例子,我们可以看成一个三位数,百位是1,十位为2,个位为3,这三位的进制是不一样的,例如,十位的进制是2,百位的进制是6,为什么呢,因为对于十位来说,当个位变化两次之后,十位就会变化一次。举个具体的例子
对于字符串”123”的编号就是0,因为对应的三位数是000,对于字符串”12C”,对应的三位数是001,所以,字符串”12C”的编号是1, 字符串”1B3”来说,对应的三位数是010(不要整个看成二进制,虽然这个时候看成二进制也是2),因为个位数只有两个变化(”3”和”C”),所以,010可以看成是001进位之后的结果,这个时候表示的就是2,”011”表示字符串”1BC”,根据十位是二进制,所以这个数表示3,下面,出现规律的情况出现了,”0b0”,这个字符串对应的三位数是多少呢?是”020”,因为十位是2进制,所以020就是2*2为4,“021”对应的是2*2 + 1 =5,下面我们看看百位的进制是多少,我们知道,到021为止,已经吧十位和个位的所有组合列举出来了,编号是0~5,总共六个数,所以,百位的进制就是6进制,如下
“100”à对应字符串”A23”,编号是6
“101”à对应的字符串是”A2C”,编号是7
“110”à对应的字符串是”AB3”,编号是8
“111”à对应的字符串是”ABC”,编号是9
“120”à对应字符串是”Ab3”,编号是10
“121”à对应字符串是”AbC”,编号是11
“200”à对应字符串是”a00”,编号是12
……
“321”à对应的字符串是”甲bC”,编号是:3*6 +2*2 + 1*1 = 23
是不是已经看出来规律了,就是三位数,对应的三个进制,百位乘以6 加上十位乘以2 加上 个位乘以1 的出来的十进制数字就是这个字符串的编号,那么百位数,十位数,个位数的怎么填充呢,就是用每位的index来填充。
反过来,如何根据编号,得到对应的字符串,
比如我们需要取出编号为19的字符串,那么,我们来看看,怎么找
我们知道,百位数有四个替换字符,index是0~3,百位的进制是6进制,6进制的整数是0(0乘以6),6(1乘以6),12(2乘以6),18(3乘以6),24(4乘以6,不过这个case我们没有百位数是4的结果,)我们先设置百位数,再设置十位数,最后设置个位数,因为19是大于18的,小于24,所以,百位数是3,19-18还剩下1,显然十位数应该设置为0,因为十位数是要乘以2的,因此个位数设置为1,拼出来的三位数就是301,取出对应的字符串就是”甲2C”这个字符串了。
以上就是利用不同为的进制不同,我们用连续的整数编号,来表示每一个组合的结果的方法,具体的代码,以后有时间不上。