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

问题描述 投票:0回答:2

早安,

我正在尝试打印某个String的所有变体。例如,我们有以下输入:AB0C0。第三和第五位的0应该被视为变量。可变字符是1、2、3,将放置在0的位置。这意味着,这些字符将是此输入的所有可能变体:

  1. AB1C1
  2. AB2C1
  3. AB3C1
  4. AB1C2
  5. AB1C3
  6. AB2C2
  7. AB2C3
  8. AB3C2
  9. 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());

热烈欢迎任何建议。

java string replace variations
2个回答
0
投票

这怎么办:

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',然后调用方法permutateAtPosition,该方法获取部分排列的列表,并将其再排列一级。

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

此解决方案将所有内容保留在内存中,因此在一般情况下(无限制的输入字符串),最好使用深度优先。


0
投票

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

int variableCount = 0;
for (int i = 0; i < 5; i++) {
    if (input.charAt(i) == '0') {
        variableCount++;
    }
}

然后计算我们期望的结果数量:

int countMax = (int)Math.pow(4,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);
}
© www.soinside.com 2019 - 2024. All rights reserved.