搜索网站和本网站后,我无法找到解决问题的确切方法。
我想生成一个以'a'开头的列表,并按以下方式迭代:a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc,aaa ... < / p>
我想指定2个变量,一个将迭代的字符串和一个显示结果的最大长度/深度的整数。我希望能够将字符串更改为我喜欢的任何长度。
String alpha = "abcdefghijklmnopqrstuvwxyz0123456789";
int depth = 6;
我希望我能够提供足够的答案。谢谢!
答案 0 :(得分:2)
这是你需要的。如果你想蛮力。
public static void combin(String input,StringBuffer output,int depth){
if (depth == 0) {
System.out.println(output);
} else {
for (int i = 0; i < input.length(); i++) {
output.append(input.charAt(i));
combin(input, output,depth - 1);
output.deleteCharAt(output.length() - 1);
}
}
}
答案 1 :(得分:0)
想象一下,最大长度强度中的每个角色都是一个“翻转者”,就像模拟计数器的翻转者(在我们使用计算机之前!)。翻转开关的侧面为-1,0,1,2 ......并且还具有以-1开始的特性(最右边的一个为0),当它从MAX开始时,它变为0而不是-1,它还会在它左边的一个滚筒上打勾(如果它也溢出,它也可以勾选它左边的滚筒,依此类推)
现在,我们有一个这样的算法:
1)初始化整数列表:-1,-1,-1 ... 0,depth
总计。请将这些作为计数器。
2)增加最右边的计数器。
3)现在是棘手的部分。保留一个整数变量,指示我们当前正在处理哪个计数器,将其称为idx = depth-1
。如果我们递增的计数器溢出,则不是跳过此步骤,而是将idx
递减1
并将新指向的计数器勾选为1.在循环中,检查是否溢出,如果是这样,则循环它围绕并向上移动一个计数器等等,直到我们移动idx
所以离开它超过0(如果是这样,返回,我们打印出所有组合并循环)或者不要溢出计数器。
4)将对应于列表索引的字符串打印到alpha
(如果为-1,则不添加任何内容)。
答案 2 :(得分:0)
您可以使用递归来轻松解决此问题:
List<String> product(String chars, int length) {
List<String> res = new ArrayList<String>();
res.add("");
if (length > 0) {
for (c : chars) {
res.addAll(product(chars, length - 1) + c);
}
}
return res;
}
对于您的给定字符串和长度,此列表将非常大(约20亿条目)。
答案 3 :(得分:0)
你要找的是递归!这是我在计算机科学中最喜欢的主题之一,所以请在这里查看:http://en.wikipedia.org/wiki/Recursion_%28computer_science%29该函数通过调用自身来创建循环。
String recurse(String dataSet, String current, int limit) {
// iterate through each character to add to the word
for (int i=0; i<dataSet.length(); i++) {
// print the current character along with the total behind it
System.out.println(current + dataSet.charAt(i));
// stop if you reach the length limit
if (current.length() < limit) {
// start again with each set of data
recurse(current + dataSet.charAt(i));
}
}
}
recurse("abc", "", 5);
答案 4 :(得分:0)
显然使用recursion我们能够以相当简短的形式写出来。该函数接受了一些集合(我在这个例子中使用了一个集合),而不是创建多个对象来减少内存开销。
public static void main(String[] args) {
Set<String> set = new TreeSet<String>();
GenerateUniques(set, "", "abcdefghijklmn", 6);
System.out.println(set.size());
}
private static void GenerateUniques(Collection<String> coll, String prefix, String chars, int depth) {
if (depth-- == 0) return;
for (int i = 0; i < chars.length(); i++) {
String str = prefix + chars.charAt(i);
coll.add(str);
GenerateUniques(coll, str, chars, depth);
}
}