给定一个长度n=4, 和a set ofcharacters->{'a','b'},如何编写一些Java代码来产生所有长度为n的字符串,其中包含集合中的字符?
n=4,
set ofcharacters->{'a','b'}
对于上面的示例,结果应具有2 ^ 4 = 16个字符串,即:
aaaa aaab aabb abbb baaa baab babb bbbb bbaa bbab bbba abaa abab abba baba aaba
这是我的代码段:
public void process(String result, String string) { if(string.length() == 0) { System.out.println(result); }else{ for(int i = 0; i < string.length(); i++) { String newResult = new String(result+string.charAt(i)); String newString = new String(string.substring(0,i) + string.substring(i+1, string.length())); process(newResult, newString); } } }
好像只是在做排列,而不是我想要的。……预先谢谢:)
以与计数相同的方式来考虑它。从技术上讲,您是从aaaa到bbbb进行“计数”,就像二进制一样。
aaaa -> 0000 aaab -> 0001 aaba -> 0010 aabb -> 0011 ... bbbb -> 1111
没有看到您尝试过的内容,我不能为您提供更多帮助,但是从本质上讲,您需要通过对它们进行计数来枚举“最低”元素和“最高”元素之间的所有“数字”。
对于较高的元素计数,只需将您的计数视为在较高的基数中计数即可。对于八个元素Set = {a,b,c,d,e,f,g,h},您将在本质上是八进制的计数:
aaaa -> 0000 aaab -> 0001 ... aaah -> 0007 aaba -> 0010 ... hhhh -> 7777
通过从0000到9999的计数,您可以枚举长度为4的0-9的所有组合。
编辑:
感谢您发布代码。您是正确的,您正在做排列。更好的方法是使用类似于此处讨论的多重组合(在有序组合集中具有重复元素的组合)算法。