替换Java中的字符串以获取所有变体

替换Java中的字符串以获取所有变体,java,string,replace,variations,Java,String,Replace,Variations,你好 我想打印出某个字符串的所有变体。例如,我们有这个输入:AB0C0。第3点和第5点的0应视为变量。变量字符为1、2、3,将放置在0的位置。这意味着,这些将是该输入的所有可能变化: AB1C1 AB2C1 AB3C1 AB1C2 AB1C3 AB2C2 AB2C3 AB3C2 AB3C3 这只是一个例子。在一个5个字符长的字符串中,有1到5个变量。我面临的问题是,它应该生成所有变量,无论输入中有多少个变量,无论它们位于何处 Scanner scanner = new Scanner (Syst

你好

我想打印出某个字符串的所有变体。例如,我们有这个输入:AB0C0。第3点和第5点的0应视为变量。变量字符为1、2、3,将放置在0的位置。这意味着,这些将是该输入的所有可能变化:

AB1C1 AB2C1 AB3C1 AB1C2 AB1C3 AB2C2 AB2C3 AB3C2 AB3C3 这只是一个例子。在一个5个字符长的字符串中,有1到5个变量。我面临的问题是,它应该生成所有变量,无论输入中有多少个变量,无论它们位于何处

Scanner scanner = new Scanner (System.in);
System.out.println("Enter the key consisting of 5 characters:");
String input = scanner.next();
String strOutput1 = input.replaceFirst("0","1");
String strOutput1A = input.replace("0","1");
String strOutput2 = input.replaceFirst("0","2");
String strOutput3 = input.replaceFirst("0","3");
String strOutput4 = input.replaceFirst("0","4");
String strOutput5 = input.replaceFirst("0","5");
System.out.println(strOutput1.toUpperCase());
System.out.println(strOutput1A.toUpperCase());
System.out.println(strOutput2.toUpperCase());
System.out.println(strOutput3.toUpperCase());
System.out.println(strOutput4.toUpperCase());
System.out.println(strOutput5.toUpperCase());
欢迎您提出任何建议。

您对此有何看法:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

public static void main(String[] args) throws Exception {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter the key consisting of 5 characters:");
    String input = scanner.next();

    //find positions of '0' in input
    List<Integer> varPositions = findVarPositions(input);

    //create permutations
    List<String> permutations = new ArrayList<>();
    permutations.add(input);//AB0C0
    for (int position : varPositions) {
        permutations = permutateAtPosition(permutations, position);
    }

    //print permutations
    for (String permutation : permutations) {
        System.out.println(permutation.toUpperCase());
    }
}

private static List<Integer> findVarPositions(String input) {
    List<Integer> varPositions = new ArrayList<>();
    int lastVarPosition = -1;
    while ((lastVarPosition = input.indexOf('0', lastVarPosition + 1)) != -1) {
        varPositions.add(lastVarPosition);
    }
    return varPositions;
}

private static List<String> permutateAtPosition(List<String> partialyPermutated, int position) {
    List<String> result = new ArrayList<>();
    char[] replacements = {'1', '2', '3', '4', '5'};
    for (String item : partialyPermutated) {
        for (int i = 0; i < replacements.length; i++) {
            String output = replaceCharAt(item, position, replacements[i]);
            result.add(output);
        }
    }
    return result;
}

private static String replaceCharAt(String input, int position, char replacement) {
    //converting to char array, because there's no method like
    //String.replaceAtPosition(position, char)
    char[] charArray = input.toCharArray();
    charArray[position] = replacement;
    return new String(charArray);
}

}
它不是固定的变量数量

其思想是提取“0”的位置,然后调用方法permutatetaposition,该方法接受部分置换列表并将其再置换一级

对于a0b0c0和值1-2,它将是['a0b0c0',然后是['a1b0c0','a2b0c0',],然后是['a1b1c0','a1b2c0','a2b1c0','a2b2c0',],最后是['a1b1c1','a1b1c2','a1b2c1','a1b2c2','a2b1c1','a2b1c2','a2b2c1a2b2c2']


此解决方案将所有内容都保留在内存中,因此在一般情况下,不受限制的输入字符串使用深度优先会更明智。

我为您提供了另一个解决方案。 第一步,获取变量的数量:

int variableCount = 0;
for (int i = 0; i < 5; i++) {
    if (input.charAt(i) == '0') {
        variableCount++;
    }
}
最后,数到基数4。用0填充数字,并替换原始输入0:

for (int i = 0; i < countMax; i++) {
    String paddedNumbers = format("%" + variableCount + "s",Integer.toString(i, 4)).replace(" ", "0");
    int replacedCount = 0;
    char[] outputChars = input.toCharArray();
    for (int j = 0; j < 5; j++) {
        if (input.charAt(j) == '0') {
            outputChars[j] = paddedNumbers.charAt(replacedCount);
            replacedCount++;
        }
    }
    System.out.println(outputChars);
}

根据您的示例中的哪些变量分配了值1、2和3?因为字符串中的已知字符数是3?也就是说,A、B和C?@MarwaEldawy 0是应从输入中检测的变量。所以A,B和C是已知的,不应该改变。另一个例子:A00BC,在这里,我们又有9个不同的组合,数字是1,2和3:A11BC,A12BC,A13BC,A21BC,A22BC,A23BC,A31BC,A32BC,A33BC。我理解这个例子。我的问题是:如果我们有这样一个字符串:A00BCDE。00应该取什么值?1、2和3也有吗?这个例子呢:A0000?0000应该取什么值?或者你的意思是字符串将始终包含5个字符,带有2个变量?@MarwaEldawy始终有5个字符,其中我们可以有1到4个零,需要用我们的值替换,它们始终是1、2、3。通过数学计算,两个变量得到3^2=9个组合,三个变量得到3^3=27个组合,四个变量得到3^4=81个组合。谢谢你的发帖。我真的很喜欢这个概念,因为它是如此普遍,可以用于更多的情况。您能否进一步说明如何处理最后一个字符串中定义的格式?我在代码中没有看到对它的其他引用。是的,它是String.format。它所做的是格式化一个字符串并向该字符串输入变量。在本例中,我使用padding函数在实际数字前面添加空格,因此如果variableCount为2,则3变为3。然后,这些空格将替换为0。所以它变成了03。做得很好。非常感谢你!
for (int i = 0; i < countMax; i++) {
    String paddedNumbers = format("%" + variableCount + "s",Integer.toString(i, 4)).replace(" ", "0");
    int replacedCount = 0;
    char[] outputChars = input.toCharArray();
    for (int j = 0; j < 5; j++) {
        if (input.charAt(j) == '0') {
            outputChars[j] = paddedNumbers.charAt(replacedCount);
            replacedCount++;
        }
    }
    System.out.println(outputChars);
}