JavaRush/Java блог/Архив info.javarush/перебор всех регистров букв
turboblufer
15 уровень

перебор всех регистров букв

Статья из группы Архив info.javarush
участников
public class Task02HelloAllCombinationsOfCases { public static void main (String[] args) { String hw = "Helo"; char[] hwArr = hw.toLowerCase().toCharArray(); char buf[] = hwArr; for (int j = 0; j < hwArr.length; j++) { for (int i = j; i < hwArr.length; i++) { buf[i] = Character.toUpperCase(buf[i]); System.out.println(buf); buf[i] = Character.toLowerCase(buf[i]); } buf[j] = Character.toUpperCase(buf[j]); } } } здравствуйте, задача такова - есть любое слово.
Программа перебирает все варианты регистров этого слова. например:
hello Hello
hEllo HeLlO .... HELLO у меня алгоритм примерно на половину готов, однако почему-то нет идей как делать дальше, тк голова вся замылена уже.
Буду рад, если поможете с кодом.
Комментарии (9)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Vash_the_Stampede
Уровень 11
10 сентября 2014, 19:32
public class Solution {

    public static void main(String args[]) {
        sortOut("hello");
    }

    public static void sortOut(String s) {
        // всего должно быть (1 << s.length()) вариантов
        s = s == null ? "example" : s;
        int n = s.length();
        char[][] set = new char[2][];
        set[0] = s.toLowerCase().toCharArray();
        set[1] = s.toUpperCase().toCharArray();

        for (int i = 0; i < 1 << n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(set[(i >> j) % 2][j]);
            }
            System.out.println();
        }
    }

}
turboblufer
Уровень 15
10 сентября 2014, 19:44
Благодарю!
turboblufer
Уровень 15
10 сентября 2014, 20:00
А что означает оператор << я это еще не проходил.

И можешь объяснить строчку System.out.print(set[(i >> j) % 2][j]);
Vash_the_Stampede
Уровень 11
10 сентября 2014, 20:11
set[(i >> j) % 2][j] возвращает соотвествующий номеру слова i и номеру символа в слове j.
0 < i < (1 << n или 2 в степени n). 0 < j < n. n = word.length().
(i >> j) % 2 — возвращает 0 или 1, что означает символ нижнего и верхнего регистра соотвественно
Vash_the_Stampede
Уровень 11
10 сентября 2014, 20:13
да, если не ошибаюсь, такой код должен работать для слова не длинее 30 букв
turboblufer
Уровень 15
10 сентября 2014, 20:41
А если вредрить какой-нибудь символ в строку, которая не буква? Как сделать так, чтобы алгоритм ее пропустил?
Vash_the_Stampede
Уровень 11
10 сентября 2014, 20:56
алгоритм то пропустит, только повторы получатся. Можно сохранить строки в коллекцию и удалить лишние, но это плохой вариант, лучше алгоритм другой тогда сделать
turboblufer
Уровень 15
10 сентября 2014, 21:13
Вот блин ((( жаль