Заменить все руссские символы на английские и наоборот

Вопрос такой как перебрать в одном слове все похожие буквы из русского алфавита и английского например есть слово джава его можно написать как джaва и джавa и джaвa (жирным курсивом выделены буквы из латинского алфавита), как сделать чтобы это делало само? Пытался что то сделать но заменяет все символы


Ответы (1 шт):

Автор решения: Vadik

Создаем HashMap из необходимых замен:

Map<Character, Character> substitutions = new HashMap<>();
substitutions.put('а', 'A');
substitutions.put('е', 'E');
substitutions.put('р', 'P');

Считаем количество букв count, которые нужно заменить в исходной строке input:

String input = "привет";
int count = 0;
for (char character : input.toCharArray()) {
    if (substitutions.containsKey(character)) {
        count += 1;
    }
}

Генерируем список всех возможных комбинаций binaryStrings в бинарном представлении. Попутно дополняем строки недостающими нулями:

List<String> binaryStrings = new ArrayList<>();
long pow = (long) Math.pow(2, count);
for (long i = 0; i < pow; i++) {
    String binaryString = Long.toBinaryString(i);
    char[] leadingZeros = new char[count - binaryString.length()];
    Arrays.fill(leadingZeros, '0');
    binaryStrings.add(String.valueOf(leadingZeros) + binaryString);
}

// binaryStrings на выходе будет списком из строк:
// ["00", "01", "10", "11"]

Наконец, делаем необходимые замены, каждому элементу списка binaryStrings сопоставляем новую строку. Символ '0' в binaryString соответствует тому, что замену делать не нужно, а символ '1' означает, что нужно сделать замену на символ в соответствии с substitutions:

List<String> outputList = new ArrayList<>();
for (String binaryString : binaryStrings) {
    char[] binaryCharArray = binaryString.toCharArray();
    StringBuilder output = new StringBuilder();
    int index = 0;
    for (char character : input.toCharArray()) {
        if (substitutions.containsKey(character)) {
            if (binaryCharArray[index] == '0') {
                output.append(character);
            } else {
                output.append(substitutions.get(character));
            }
            index++;
        } else {
            output.append(character);
        }
    }
    outputList.add(output.toString());
}

// outputList на выходе будет содержать все возможные комбинации замен:
// ["привет", "привEт", "пPивет", "пPивEт"]
→ Ссылка