栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从数组到特定长度的所有可能字符串组合的算法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从数组到特定长度的所有可能字符串组合的算法

几乎是基本转换

此解决方案是出于以下观察的目的:如果不是为了在有效组合的高位位置重复数组索引0处的字符,则此问题将只是从十进制到新的基数的基数转换。从0到(base ^
length)-1的所有整数。所以,

0 = a1 = b...1294 = 33321295 = 3333

困难在于,它会错过与一个或多个前导“ a”的组合,例如:

aa...a1aa1aaa1

这些是 唯一
缺少的解决方案。因此,人们可以简单地,对于具有长度小于MAX_LENGTH每个生成的组合中,添加“一个”(或任何为字母[0])的字符串的前面,并且输出
串,重复如有必要。因此,如果生成字符串“ b”,则将输出:

babaabaaab

这行得通,但令人不满意,首先是因为它看起来像是一个过时的解决方案。其次,它不会按字典顺序生成解决方案,这可能是问题,也可能不是问题。第三,如果生成组合的函数是双射的,那将非常好,这样我们就可以知道由任何给定的十进制整数和任何组合的唯一索引产生的唯一组合。稍后这将很关键。

想象没有零

如果零指数给我们带来了问题,那为什么不取消它呢?假设我们将数组更改为:

字母= {∅,’a’,’b’,’c’,‘1’,‘2’,‘3’}

其中∅是一个永远不会使用的任意占位符。现在,我们将尝试在不使用数字零的情况下,在新的基数(在本例中仍为6,而不是7)中表示从1到base ^
max_length的十进制整数。我们将正常情况下从1到base-1的数字表示为(1、2、3,…),但是当等于等于基数的数字而不是将其表示为10时,我们将其表示为基本数字(例如6而不是6的10)。下一个数字,base
+ 1,将是11,然后是12,最多16(等于十进制的12),然后最多21。每个数字

a n,a n-1,…,a 1,a 0

在新的基数等于

a n * b n + a n-1 * b n-1 + … + a 1 * b 1 + a 0 * b 0

以十进制表示,其中b是新的基数。

当我开始学习时,这恰当地称为双射数。举一个例子,在基数6中,我们将有:

base 10    base 61          12          2...6          67          118          12...11         1512         1613         21...36         56

在上面的Wikipedia链接中,新基准中数字的第一个“数字”为:

a 0 = m-q 0 k

其中k是新的底数,m是要转换的整数,q 0 = ceiling(m / k)-1。请注意,它与常规基本转换的相似之处,唯一的区别是q 0为floor(m /
k)或普通整数除法。使用q 0而不是m来找到1,类似地计算随后的“数字”,以此类推。

该公式可以分为两种情况:

  • (m mod k)== 0:a 0 = k和q 0 =(m div k)-1
  • (m mod k)!= 0:a 0 =(m mod k)和q 0 =(m div k)

这是算法的核心。对于任何整数m,我们都可以迭代地应用该公式,直到得出的q p
==0。还要注意,转换自然是可逆的。给定以

6666
6为底的数字,十进制值为:

(6*6^3)+(6*6^2)+(6*6^1)+(6*6^0)=1554

我们使用这一事实来找到要转换的整数范围,以便获得一定长度的所有组合。抱歉,但是我的PHP技能不存在。希望Java代码足够清晰。鉴于:

    char [] letters = new char [] {'0','a','b','c','1','2','3'};    int max_length = 4;

我们具有以下功能:

    int b = letters.length - 1;  // base to convert to    int n = 0;    for (int k = 0; k < max_length; k++)        n = (n*b)+b;  // number of combinations    int remainder;    for (int i = 1; i <= n; i++) {        int current = i;  // m and q_n in the formula        String combination = "";        do { remainder = current % b; if (remainder == 0) {     combination += letters[b];     current = current/b - 1; } else {     combination += letters[remainder];     current = current/b; }        } while (current > 0);        System.out.println(combination);    }

其中/表示整数除法,或floor(a / b)。

该函数仅依赖于输入整数,而不依赖于先前计算的结果,因此并行处理的可能性非常好。

这是带有上述输入的输出。根据您的示例,最低有效数字在第一位。

abc123aabaca1a2a3aabbbcb1b2b3bacbccc1c2c3ca1b1c1112131a2b2c2122232a3b3c3132333aaabaacaa1aa2aa3aaababbacba1ba2ba3baacabcacca1ca2ca3caa1ab1ac1a11a21a31aa2ab2ac2a12a22a32aa3ab3ac3a13a23a33aaabbabcab1ab2ab3ababbbbbcbb1bb2bb3bbacbbcbccb1cb2cb3cba1bb1bc1b11b21b31ba2bb2bc2b12b22b32ba3bb3bc3b13b23b33baacbaccac1ac2ac3acabcbbccbc1bc2bc3bcaccbccccc1cc2cc3cca1cb1cc1c11c21c31ca2cb2cc2c12c22c32ca3cb3cc3c13c23c33caa1ba1ca11a12a13a1ab1bb1cb11b12b13b1ac1bc1cc11c12c13c1a11b11c11111211311a21b21c21121221321a31b31c31131231331aa2ba2ca21a22a23a2ab2bb2cb21b22b23b2ac2bc2cc21c22c23c2a12b12c12112212312a22b22c22122222322a32b32c32132232332aa3ba3ca31a32a33a3ab3bb3cb31b32b33b3ac3bc3cc31c32c33c3a13b13c13113213313a23b23c23123223323a33b33c33133233333aaaabaaacaaa1aaa2aaa3aaaabaabbaacbaa1baa2baa3baaacaabcaaccaa1caa2caa3caaa1aab1aac1aa11aa21aa31aaa2aab2aac2aa12aa22aa32aaa3aab3aac3aa13aa23aa33aaaabababacaba1aba2aba3abaabbabbbacbba1bba2bba3bbaacbabcbaccba1cba2cba3cbaa1bab1bac1ba11ba21ba31baa2bab2bac2ba12ba22ba32baa3bab3bac3ba13ba23ba33baaacabacacaca1aca2aca3acaabcabbcacbca1bca2bca3bcaaccabccaccca1cca2cca3ccaa1cab1cac1ca11ca21ca31caa2cab2cac2ca12ca22ca32caa3cab3cac3ca13ca23ca33caaa1aba1aca1a1a1a2a1a3a1aab1abb1acb1a1b1a2b1a3b1aac1abc1acc1a1c1a2c1a3c1aa11ab11ac11a111a211a311aa21ab21ac21a121a221a321aa31ab31ac31a131a231a331aaa2aba2aca2a1a2a2a2a3a2aab2abb2acb2a1b2a2b2a3b2aac2abc2acc2a1c2a2c2a3c2aa12ab12ac12a112a212a312aa22ab22ac22a122a222a322aa32ab32ac32a132a232a332aaa3aba3aca3a1a3a2a3a3a3aab3abb3acb3a1b3a2b3a3b3aac3abc3acc3a1c3a2c3a3c3aa13ab13ac13a113a213a313aa23ab23ac23a123a223a323aa33ab33ac33a133a233a333aaaabbaabcaab1aab2aab3aabababbbabcbab1bab2bab3babacabbcabccab1cab2cab3caba1abb1abc1ab11ab21ab31aba2abb2abc2ab12ab22ab32aba3abb3abc3ab13ab23ab33abaabbbabbcabb1abb2abb3abbabbbbbbbcbbb1bbb2bbb3bbbacbbbcbbccbb1cbb2cbb3cbba1bbb1bbc1bb11bb21bb31bba2bbb2bbc2bb12bb22bb32bba3bbb3bbc3bb13bb23bb33bbaacbbacbcacb1acb2acb3acbabcbbbcbcbcb1bcb2bcb3bcbaccbbccbcccb1ccb2ccb3ccba1cbb1cbc1cb11cb21cb31cba2cbb2cbc2cb12cb22cb32cba3cbb3cbc3cb13cb23cb33cbaa1bba1bca1b1a1b2a1b3a1bab1bbb1bcb1b1b1b2b1b3b1bac1bbc1bcc1b1c1b2c1b3c1ba11bb11bc11b111b211b311ba21bb21bc21b121b221b321ba31bb31bc31b131b231b331baa2bba2bca2b1a2b2a2b3a2bab2bbb2bcb2b1b2b2b2b3b2bac2bbc2bcc2b1c2b2c2b3c2ba12bb12bc12b112b212b312ba22bb22bc22b122b222b322ba32bb32bc32b132b232b332baa3bba3bca3b1a3b2a3b3a3bab3bbb3bcb3b1b3b2b3b3b3bac3bbc3bcc3b1c3b2c3b3c3ba13bb13bc13b113b213b313ba23bb23bc23b123b223b323ba33bb33bc33b133b233b333baaacbaaccaac1aac2aac3aacabacbbaccbac1bac2bac3bacacacbcacccac1cac2cac3caca1acb1acc1ac11ac21ac31aca2acb2acc2ac12ac22ac32aca3acb3acc3ac13ac23ac33acaabcbabccabc1abc2abc3abcabbcbbbccbbc1bbc2bbc3bbcacbcbcbcccbc1cbc2cbc3cbca1bcb1bcc1bc11bc21bc31bca2bcb2bcc2bc12bc22bc32bca3bcb3bcc3bc13bc23bc33bcaaccbacccacc1acc2acc3accabccbbcccbcc1bcc2bcc3bccacccbccccccc1ccc2ccc3ccca1ccb1ccc1cc11cc21cc31cca2ccb2ccc2cc12cc22cc32cca3ccb3ccc3cc13cc23cc33ccaa1cba1cca1c1a1c2a1c3a1cab1cbb1ccb1c1b1c2b1c3b1cac1cbc1ccc1c1c1c2c1c3c1ca11cb11cc11c111c211c311ca21cb21cc21c121c221c321ca31cb31cc31c131c231c331caa2cba2cca2c1a2c2a2c3a2cab2cbb2ccb2c1b2c2b2c3b2cac2cbc2ccc2c1c2c2c2c3c2ca12cb12cc12c112c212c312ca22cb22cc22c122c222c322ca32cb32cc32c132c232c332caa3cba3cca3c1a3c2a3c3a3cab3cbb3ccb3c1b3c2b3c3b3cac3cbc3ccc3c1c3c2c3c3c3ca13cb13cc13c113c213c313ca23cb23cc23c123c223c323ca33cb33cc33c133c233c333caaa1baa1caa11aa12aa13aa1aba1bba1cba11ba12ba13ba1aca1bca1cca11ca12ca13ca1a1a1b1a1c1a111a121a131a1a2a1b2a1c2a112a122a132a1a3a1b3a1c3a113a123a133a1aab1bab1cab11ab12ab13ab1abb1bbb1cbb11bb12bb13bb1acb1bcb1ccb11cb12cb13cb1a1b1b1b1c1b111b121b131b1a2b1b2b1c2b112b122b132b1a3b1b3b1c3b113b123b133b1aac1bac1cac11ac12ac13ac1abc1bbc1cbc11bc12bc13bc1acc1bcc1ccc11cc12cc13cc1a1c1b1c1c1c111c121c131c1a2c1b2c1c2c112c122c132c1a3c1b3c1c3c113c123c133c1aa11ba11ca111a112a113a11ab11bb11cb111b112b113b11ac11bc11cc111c112c113c11a111b111c111111121113111a211b211c211121122113211a311b311c311131123113311aa21ba21ca211a212a213a21ab21bb21cb211b212b213b21ac21bc21cc211c212c213c21a121b121c121112121213121a221b221c221122122213221a321b321c321132123213321aa31ba31ca311a312a313a31ab31bb31cb311b312b313b31ac31bc31cc311c312c313c31a131b131c131113121313131a231b231c231123122313231a331b331c331133123313331aaa2baa2caa21aa22aa23aa2aba2bba2cba21ba22ba23ba2aca2bca2cca21ca22ca23ca2a1a2b1a2c1a211a221a231a2a2a2b2a2c2a212a222a232a2a3a2b3a2c3a213a223a233a2aab2bab2cab21ab22ab23ab2abb2bbb2cbb21bb22bb23bb2acb2bcb2ccb21cb22cb23cb2a1b2b1b2c1b211b221b231b2a2b2b2b2c2b212b222b232b2a3b2b3b2c3b213b223b233b2aac2bac2cac21ac22ac23ac2abc2bbc2cbc21bc22bc23bc2acc2bcc2ccc21cc22cc23cc2a1c2b1c2c1c211c221c231c2a2c2b2c2c2c212c222c232c2a3c2b3c2c3c213c223c233c2aa12ba12ca121a122a123a12ab12bb12cb121b122b123b12ac12bc12cc121c122c123c12a112b112c112111221123112a212b212c212121222123212a312b312c312131223123312aa22ba22ca221a222a223a22ab22bb22cb221b222b223b22ac22bc22cc221c222c223c22a122b122c122112221223122a222b222c222122222223222a322b322c322132223223322aa32ba32ca321a322a323a32ab32bb32cb321b322b323b32ac32bc32cc321c322c323c32a132b132c132113221323132a232b232c232123222323232a332b332c332133223323332aaa3baa3caa31aa32aa33aa3aba3bba3cba31ba32ba33ba3aca3bca3cca31ca32ca33ca3a1a3b1a3c1a311a321a331a3a2a3b2a3c2a312a322a332a3a3a3b3a3c3a313a323a333a3aab3bab3cab31ab32ab33ab3abb3bbb3cbb31bb32bb33bb3acb3bcb3ccb31cb32cb33cb3a1b3b1b3c1b311b321b331b3a2b3b2b3c2b312b322b332b3a3b3b3b3c3b313b323b333b3aac3bac3cac31ac32ac33ac3abc3bbc3cbc31bc32bc33bc3acc3bcc3ccc31cc32cc33cc3a1c3b1c3c1c311c321c331c3a2c3b2c3c2c312c322c332c3a3c3b3c3c3c313c323c333c3aa13ba13ca131a132a133a13ab13bb13cb131b132b133b13ac13bc13cc131c132c133c13a113b113c113111321133113a213b213c213121322133213a313b313c313131323133313aa23ba23ca231a232a233a23ab23bb23cb231b232b233b23ac23bc23cc231c232c233c23a123b123c123112321233123a223b223c223122322233223a323b323c323132323233323aa33ba33ca331a332a333a33ab33bb33cb331b332b333b33ac33bc33cc331c332c333c33a133b133c133113321333133a233b233c233123322333233a333b333c333133323333333


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/380743.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号