我在这里浏览了所有关于Permutation String的方法,我是一个接近的方法,但它仍然没有像我期望的那样工作。如何从此输入生成输出:
输入:5,输出:显示从a
到zzzzz
的字符串组合。
如果我输入6作为输入,它将来自a
的{{1}}输出。
这里有办法吗? 我发现如果我放3,我应该使用3个循环,6个输入意味着6个循环,但我仍然是静态的,而不是动态的。我的意思是我不能通过3输入制作3个循环。
这是我目前的代码:
zzzzzz
*编辑:*我上面的代码直接显示5长度,这是我希望它从1长度到5(输入)开始。
答案 0 :(得分:1)
我认为这是一个“学习练习”而不是真正的编程问题。 (没有人在正确的思想中尝试将26^6
(即3.08亿)行写入标准输出......)
所以这是一个提示:
char[]
。我还应该补充一点,这不是置换问题。这是组合问题。而且这里没有排序。而是按顺序生成字符串。
答案 1 :(得分:1)
首先,让我们看看你当前的代码是做什么的:
您有整数i
,j
和k
,它们都从0开始。整数i
对应于pattern
变量中的字母你将使用你的字符串的第一个位置。整数j
对应于第二个位置,k
对应于第三个位置。
然后,您的循环按以下顺序修改i
,j
和k
的值:
i=0, j=0, k=0 => corresponds to "aaa"
i=0, j=0, k=1 => corresponds to "aab"
i=0, j=0, k=2 => corresponds to "aac"
这一直持续到
i=0, j=0, k=25 => corresponds to "aaz"
i=0, j=1, k=0 => corresponds to "aba"
我们看到j
递增1并k
重置为0.同样,当j
= 25且k
= 25后,我们会增加{ {1}}一个,并将i
和j
重置为0.然后我们再次开始递增k
。它类似于我们的十进制表示法,在199之后我们得到200.
因此,要将其应用于不断变化的长度,我们需要一种以动态方式存储变量的方法。最好的工具是整数数组。
想象一下整数数组k
。它的长度取决于你的输入。您可以像这样初始化它:
int idx[]
现在我们将使用int idx[] = new int[n];//where n is the length of the generated strings
来存储idx
,i
和j
等整数,它们将对应于用于生成字符串的字符。例如,如果k
数组的长度为6且值为[0,0,2,4,25,25],则它将对应于字符串“aacezz”。
要生成所有可能的字符串,请将idx
的所有值设置为0(对应于“aaaaaa”),然后创建while循环。在每次迭代中,您“递增”idx
in的值以获取下一个生成的字符串。这是基本结构的样子
idx
请注意,我没有输入代码 - 只是描述了java注释中应该发生的事情。你应该能够填补其余部分。
祝你好运!答案 2 :(得分:1)
以下是使用两种方法相互调用的递归模式示例。
private String pattern = "abcdefghijklmnopqrstuvxyz";
private int numChar = 3;
public void permutateY(String prefix, int charPos, int patternPos) {
if (patternPos>=pattern.length()) return;
if (prefix == null) {
permutateX(String.valueOf(pattern.charAt(patternPos)), charPos+1, 0);
} else {
permutateX(prefix + String.valueOf(pattern.charAt(patternPos)), charPos+1, 0);
}
permutateY(prefix, charPos, patternPos+1);
}
public void permutateX(String combi, int charPos, int patternPos) {
if (charPos < numChar) {
permutateY(combi, charPos, 0);
} else {
System.out.println(combi);
}
}
然而,我完全赞同@Stephen C,它打印出来的疯狂26 ^ 6:p
答案 3 :(得分:1)
这将按预期工作。但请记住斯蒂芬C所说的话。
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Map<Integer, String> myMap = new HashMap<>();
myMap.put(1, "a");
myMap.put(2, "b");
myMap.put(3, "c");
myMap.put(4, "d");
myMap.put(5, "e");
myMap.put(6, "f");
myMap.put(7, "g");
myMap.put(8, "h");
myMap.put(9, "i");
myMap.put(10, "j");
myMap.put(11, "k");
myMap.put(12, "l");
myMap.put(13, "m");
myMap.put(14, "n");
myMap.put(15, "o");
myMap.put(16, "p");
myMap.put(17, "q");
myMap.put(18, "r");
myMap.put(19, "s");
myMap.put(20, "t");
myMap.put(21, "u");
myMap.put(22, "v");
myMap.put(23, "w");
myMap.put(24, "x");
myMap.put(25, "y");
myMap.put(26, "z");
Scanner in = new Scanner(System.in);
System.out.println("Enter limit here [input type: integer]\n");
int lim = in.nextInt();
String[] arr = new String[26 * lim];
int i = 0;
int j = lim;
int k = 1;
while (i < arr.length) {
while (lim > 0) {
arr[i] = myMap.get(k);
lim--;
i++;
}
lim = j;
k++;
}
print_nCr(arr,arr.length, lim);
}
public static final void print_nCr(String[] arr,final int n, final int r) {
int[] res = new int[r];
for (int i = 0; i < res.length; i++) {
res[i] = i + 1;
}
boolean done = false;
while (!done) {
for(int i=0;i<res.length;i++){
System.out.print(arr[res[i]-1]);
}
System.out.print("\n");
done = getNext(res, n, r);
}
}
public static final boolean getNext(final int[] num, final int n, final int r) {
int target = r - 1;
num[target]++;
if (num[target] > ((n - (r - target)) + 1)) {
while (num[target] > ((n - (r - target)))) {
target--;
if (target < 0) {
break;
}
}
if (target < 0) {
return true;
}
num[target]++;
for (int i = target + 1; i < num.length; i++) {
num[i] = num[i - 1] + 1;
}
}
return false;
}
}
以下是您编辑过的问题的答案。试试这个
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Map<Integer, String> myMap = new HashMap<>();
myMap.put(1, "a");
myMap.put(2, "b");
myMap.put(3, "c");
myMap.put(4, "d");
myMap.put(5, "e");
myMap.put(6, "f");
myMap.put(7, "g");
myMap.put(8, "h");
myMap.put(9, "i");
myMap.put(10, "j");
myMap.put(11, "k");
myMap.put(12, "l");
myMap.put(13, "m");
myMap.put(14, "n");
myMap.put(15, "o");
myMap.put(16, "p");
myMap.put(17, "q");
myMap.put(18, "r");
myMap.put(19, "s");
myMap.put(20, "t");
myMap.put(21, "u");
myMap.put(22, "v");
myMap.put(23, "w");
myMap.put(24, "x");
myMap.put(25, "y");
myMap.put(26, "z");
Scanner in = new Scanner(System.in);
System.out.println("Enter limit here [input type: integer]\n");
int lim = in.nextInt();
String[] arr;
for(int x=1;x<lim+1;x++){
arr= new String[26 * x];
int i = 0;
int j = x;
int k = 1;
while (i < arr.length) {
while (x > 0) {
arr[i] = myMap.get(k);
x--;
i++;
}
x = j;
k++;
}
print_nCr(arr,arr.length, x);
}
}
public static final void print_nCr(String[] arr,final int n, final int r) {
int[] res = new int[r];
for (int i = 0; i < res.length; i++) {
res[i] = i + 1;
}
boolean done = false;
while (!done) {
for(int i=0;i<res.length;i++){
System.out.print(arr[res[i]-1]);
}
System.out.print("\n");
done = getNext(res, n, r);
}
}
public static final boolean getNext(final int[] num, final int n, final int r) {
int target = r - 1;
num[target]++;
if (num[target] > ((n - (r - target)) + 1)) {
while (num[target] > ((n - (r - target)))) {
target--;
if (target < 0) {
break;
}
}
if (target < 0) {
return true;
}
num[target]++;
for (int i = target + 1; i < num.length; i++) {
num[i] = num[i - 1] + 1;
}
}
return false;
}
}