Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/47: Рейтинг темы: голосов - 47, средняя оценка - 4.60
13 / 9 / 10
Регистрация: 03.06.2016
Сообщений: 50

Задача с анаграммами - логика программы

05.06.2016, 23:28. Показов 9683. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дорогие друзья помогите пошагово разобрать задачу с анаграммами

Пользователь вводит через один пробел слова. Найти все группы анаграмм (слов, составленных из одних и тех же букв) в этой строке и вывести на устройство вывода их каждую с новой строки, все слова должны идти через пробел в порядке, в котором они встречаются в строке. При этом допускается выводить одинаковые слова в одной строке анаграмм. Слова состоящие из разного количества одинаковых букв анаграммами не являются. Пример:

Входная строка: «123*456*231*546*231*312 4556»

Результат:
123*231*231*312
456*546
4556

Что я сделал:
- принимаю строку
- перевожу из строки слова в массив
- далее беру первое слово из массива и сравниваю по символьно с вторым словом из массива
и допустим 123 с 321 совпало что делать дальше я никак не могу сообразить. Прошу помогите поэтапно разложить.

Привожу свой код. Здесь я пытаюсь сравнить первое слово со вторым, чтобы потом переделать под массив как то так...

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 package pkgchar;
import java.util.Scanner;
 
public class Char {
 
    public static void main(String[] args) {
      
    Scanner in = new Scanner(System.in);
    
    System.out.println("Введите первое число ");
    String  text1 = in.nextLine(); //считываем одну строку целиком
    char[] ch3 = text1.toCharArray(); // преобразуем строку в массив данных
    
    System.out.println("Введите второе число ");
    String  text2 = in.nextLine(); //считываем одну строку целиком
    char[] ch4 = text2.toCharArray(); // преобразуем строку в массив данных
       
if(text1.length()==text2.length()){ // Сравниваем длину строки 1 с длиной строки 2 
    int timer = 0;   
    
    for(int i = 0; i <= ch3.length - 1; i = i + 1) {
          for(int j = 0; j <= ch4.length - 1; j = j + 1) {
              if (ch3[i]==ch4[j]){
                  timer = timer + 1;
               //System.out.println("Символы одинаковые " + ch3[i] + " " + ch4[j]); промежуточное выполнение программы
                  
                 }
            }
        }  
    System.out.println("Символы совпали " + timer + " раз");
    
    if(timer == text1.length()){
       System.out.println("Слова являются анаграммами"); 
     }
    else{
       System.out.println("Слова не являются анаграммами");
    }
    }
 
else{
    System.out.println("Слова не являются анаграммами");  
}
    }    
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.06.2016, 23:28
Ответы с готовыми решениями:

Являются ли две строки анаграммами
Реализуйте метод, проверяющий, являются ли две строки анаграммами, т.е. можно ли простой перестановкой символов получить из одной строки...

Проверить, являются ли 2 строки анаграммами
Добрый день Необходимо узнать, являются ли 2 строки анаграммами Правильно ли я рассуждаю, что необходимо сравнить длину двух строк, а...

Проверить являются ли две строки анаграммами
Доброго времени суток. Требуется свежий взгляд. Я пишу программу, которая проверяет, являются ли две строки анаграммами. Анаграмма - это...

28
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
05.06.2016, 23:46
Я бы решил сортировкой. Arrays.sort(char[]) в помощь.
0
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
06.06.2016, 10:03
Этот метод может помочь:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package cyberforum;
 
public class CyberForum {
 
    private static int isRevers(String surce, String revers) {
       if (surce.length() != revers.length())
           return -1;
 
        char [] tempSourse = surce.toCharArray();
        char [] tempRevers = revers.toCharArray();
        int summ = 0;
        for (int i = 0; i < tempSourse.length; i++) {
            summ += tempSourse[i] - tempRevers[tempSourse.length - 1 - i];
        }
        return summ;
    }
 
    public static void main(String[] args) {
        String straight = "qwer";
        String inverse = "rewq";
        if(isRevers(straight,inverse) == 0)
            System.out.println("Инверсная пара: " + straight + " <-> " + inverse);
    }
}
0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
06.06.2016, 10:28
Aviz__, А может и не помочь. Что будет если на вход прийдут например "bd" и "cc"?
0
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
06.06.2016, 11:36
ninjacut, Специально для вас запустил))
Инверсная пара: bd <-> db
Инверсная пара: cc <-> cc
0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
06.06.2016, 11:37
Aviz__, Инверсная пара: cc <-> bd
1
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
06.06.2016, 11:50
Алгоритм дал сбой! Спасибо!!!

Добавлено через 6 минут
Исправил
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package cyberforum;
 
public class CyberForum {
 
    private static int isRevers(String surce, String revers) {
        if (surce.length() != revers.length())
            return -1;
 
        char [] tempSourse = surce.toCharArray();
        char [] tempRevers = revers.toCharArray();
        int summ = 0;
        for (int i = 0; i < tempSourse.length; i++) {
            if (tempSourse[i] != tempRevers[tempSourse.length - 1 - i]) {
                summ++;
                break;
            }
        }
        return summ;
    }
 
    public static void main(String[] args) {
        String straight = "cc";
        String inverse = "cc";
        if(isRevers(straight,inverse) == 0)
            System.out.println("Инверсная пара: " + straight + " <-> " + inverse);
    }
}
1
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
06.06.2016, 11:58
Лучший ответ Сообщение было отмечено Psyh как решение

Решение

Aviz__, В этом варианте, 123 и 231 не подходят как того требовало условие задачи.
Самый легкий способ, по-моему
Java
1
2
3
4
5
6
7
8
9
10
11
12
private static boolean isRevers(String surce, String revers) {
        char [] a = surce.toCharArray();
        char [] b = revers.toCharArray();
        Arrays.sort(a);
        Arrays.sort(b);
        
        if (Arrays.equals(a, b)) {
            return true;
        }
        
        return false;
    }
1
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
06.06.2016, 12:05
ninjacut, Да, ваше решение проще и изящнее) для этого случая.
0
13 / 9 / 10
Регистрация: 03.06.2016
Сообщений: 50
06.06.2016, 15:56  [ТС]
Спасибо большое очень помогли!
0
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
07.06.2016, 09:26
В ошибочной версии моего алгоритма, как вы успели догадаться, я хотел реализовать сравнение, но без if(). Сразу не пришло на ум использовать оператор OR ^
В итоге, получилось вот что:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package cyberforum;
 
public class CyberForum {
 
    private static int isRevers(String surce, String revers) {
        if (surce.length() != revers.length())
            return -1;
 
        char [] tempSourse = surce.toCharArray();
        char [] tempRevers = revers.toCharArray();
        int summ = 0;
        for (int i = 0; i < tempSourse.length; i++) {
            summ += tempSourse[i]^tempRevers[tempSourse.length - 1 - i];
        }
        return summ;
    }
 
    public static void main(String[] args) {
        String straight = "db";
        String inverse = "bd";
        if(isRevers(straight,inverse) == 0)
            System.out.println("Инверсная пара: " + straight + " <-> " + inverse);
    }
}
Bash
1
Инверсная пара: db <-> bd
0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
07.06.2016, 13:06
Aviz__, Не понял к чему этот вариант если он опять же не работает для варианта: 123 = 213
0
13 / 9 / 10
Регистрация: 03.06.2016
Сообщений: 50
07.06.2016, 13:40  [ТС]
Я вот переделал под условия задачи, все работает, но есть одна проблема как добиться чтобы результат выводился как в условии задачи?
Т.е.
Входная строка: «123 456 231 546 231 312 4556»

Результат:
123 231 231 312
456 546
4556

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package anagramma_1;
 
import java.util.Arrays;
import java.util.Scanner;
 
public class Anagramma_1 {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);    
        System.out.println("Введите числа через пробел ");
        String  text = in.nextLine();    // cчитываем одну строку целиком
        String[] word = text.split(" "); // переводим строку в массив данных
       
        for(int i = 0; i <= word.length - 1; i = i + 1) {
            for(int j = i + 1; j <= word.length - 1; j = j + 1)
            if(isRevers(word[i],word[j]) == true){
            System.out.println("Слова являются анаграммами: " + word[i] + "  " + word[j]);
            }
        }
    }
    
    private static boolean isRevers(String surce, String revers) {
        char [] a = surce.toCharArray(); // преобразуем строку в массив символов
        char [] b = revers.toCharArray();
        Arrays.sort(a);
        Arrays.sort(b);
        
        if (Arrays.equals(a, b)) { 
            return true;
        }
        
        return false;
    }
}
Результат выполнения программы:
Миниатюры
Задача с анаграммами - логика программы  
0
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
07.06.2016, 13:51
Цитата Сообщение от ninjacut Посмотреть сообщение
Не понял к чему этот вариант
Для этого случая ни зачем))
0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
07.06.2016, 14:02
Psyh, Первое что приходит в голову, делаешь Map<String, List<String>> и соответственно вначале добавляется первое слово в качестве ключа, далее проверяется каждое следующее слово - является ли оно анаграммой каждого ключа, если подходит к какому-то ключу, добавляем в список значений, если нет - то добавляем новый ключ.
Ну или List<List<>> или двумерный массив, как захочется, но удобней с Map по-поему.
0
13 / 9 / 10
Регистрация: 03.06.2016
Сообщений: 50
07.06.2016, 14:24  [ТС]
ninjacut, Да я когда искал в Google про анаграммы,то там тоже советовали решить задачу через Map<String. У меня слишком мало опыта в программировании и я не смог найти подробное описание по Map<String с простым примером. В голове никак не складывается как его использовать. У вас нету какой нибудь литературы по этому вопросу где будет все разжевано для чайников как я?

Не по теме:

Я над этой задачей бьюсь с четверга(02.06) никак не получается ничего сделать. Собеседование я провалил, надо было три задачи еще в понедельник сдать. Но в этой задаче надо разобраться до конца.

0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
07.06.2016, 14:37
Ну если ты не разбираешься в коллекциях ты рановато на собеседования пошел, в том смысле что не устроишься. Но если не проблема получать отказы, то можешь ходить, хоть поймешь что не знаешь, что надо еще выучить.
То есть, тебе надо не только разобраться в Map, а в общем в Generics и в Collections. Насчет литературы, посмотри в сторону книг Head First Java, Thinking in Java или в Core Java Volume I (больше как справочник, мне не нравится как написано, но это субъективно, многим почему-то нравится) - главы на эти темы, и выбери что более доступно/нравится. Или сам поищи в гугле, на эту тему очень много расписано.
1
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
09.06.2016, 10:39
Немного подумав, я нашел еще более красивый способ
Psyh, Спасибо, что поделился этой задачкой
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package cybforumOOPWord;
 
public class Word {
    private String content;
    private int summaCodOfChars;
 
    public Word(String content) {
        this.summaCodOfChars = getSummaCodChars(content);
        this.content = content;
    }
 
    private int getSummaCodChars(String strForSumm) {
        char [] tmpChArr = strForSumm.toCharArray();
        int result = 0;
        for (int i = 0; i < tmpChArr.length; i++) {
            result += tmpChArr[i];
        }
        return result;
    }
 
    public int getSummaCodOfChars() {
        return summaCodOfChars;
    }
 
    @Override
    public String toString() {
        return content;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package cybforumOOPWord;
 
import java.util.ArrayList;
import java.util.Collections;
 
public class Sentence {
    private static String name;
    private static String contentSent;
    private static ArrayList<Word> words = new ArrayList<>();
 
    public Sentence(String name, String beginContent) {
        Sentence.name = name;
        Sentence.contentSent = beginContent;
    }
 
    private static void makeWords() {
        String [] tmpWords = contentSent.split(" ");
        for (int i = 0; i < tmpWords.length; i++) {
            words.add(new Word(tmpWords[i]));
        }
    }
 
    private static void printGrupAnagram() {
        int tmp = words.get(0).getSummaCodOfChars();
        for (int i = 0; i < words.size() - 1; i++) {
            if (tmp == words.get(i + 1).getSummaCodOfChars()) {
                System.out.print(words.get(i) + " ");
            }
            else {
                tmp = words.get(i + 1).getSummaCodOfChars();
                System.out.print(words.get(i) + " \n");
            }
        }
        System.out.print(words.get(words.size() - 1));
    }
 
    public static void main(String[] args) {
        Sentence mySentence = new Sentence("First SNTC", "0123 0524 1203 3021 7402 1032 9845 4250 5489");
        makeWords();
        System.out.printf("Исходная комбинация "слов" : %s\n", words);
        Collections.sort(words, new WordComparator());
        System.out.println("Группы анаграм:");
        printGrupAnagram();
    }
}
Java
1
2
3
4
5
6
7
8
9
package cybforumOOPWord;
 
import java.util.Comparator;
 
public class WordComparator implements Comparator<Word> {
    public int compare(Word word1, Word word2) {
        return word1.getSummaCodOfChars() - word2.getSummaCodOfChars();
    }
}
Bash
1
2
3
4
5
6
Исходная комбинация "слов" : [0123, 0524, 1203, 3021, 7402, 1032, 9845, 4250, 5489]
Группы анаграм:
0123 1203 3021 1032 
0524 4250 
7402 
9845 5489
0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
09.06.2016, 10:55
Я уже указывал на ошибки в твоем похожем решении здесь
Bash
1
2
3
4
Исходная комбинация "слов" : [5674, 4567, 3388, 13, 8860]
Группы анаграм:
13 
5674 4567 3388 8860
0
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
09.06.2016, 11:22
ninjacut, Ёмаё, одна сумма то может быть составлена из разных чисел! 10 = 5 + 5 = 7 + 3!
Согласен, плохо быть дукраком А так хотелось найти простой способ...

Добавлено через 12 минут
ninjacut, Существуют ли какиенить преобразования для создания уникальных "сумм", для разных комбинаций одних и тех же символов?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.06.2016, 11:22
Помогаю со студенческими работами здесь

Логика программы
Всем доброго времени суток! Помогите, пожалуйста, понять логику программы (код дан целиком) по теме связанные списки типа очередь. Код взят...

Логика программы
Объясните пожалуйста мне саму логику программы, код я напишу сам Условие задачи: Множество символов I-ричной системы счисления...

Логика программы
Всем привет!!! Делаю БД с помощью АДО компонентов...начались всякие косяки...=( Щас расскажу: Запускаем БД - загружается главная форма...

Логика работы программы
Помогите доработать программу. Я застопорился на логике её работы и никак не могу заставить ее нормально работать. Ткните меня в мои...

Интересная сложная задача: Рекурсивный запрос + логика
Помогите кто может, уже неделю не могу разобраться! У меня есть данные в таблице. Это RDF триплеты, но можно об этом не думать. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru