Учитывая две строки в одном входе (разделенные запятыми), как узнать, равна ли перестановка строки S1 строке S2 в Java? - PullRequest
2 голосов
/ 19 мая 2019

Ввод - "sumit mitsu"

Как узнать, соответствует ли перестановка одного из строк другой. Пожалуйста, найдите мой код ниже по моей попытке и помогите, если мой подход правильный Я также пытался использовать Arrays.sort для сортировки строки, но редактор hackerEarth не принимает Arrays.sort. Есть ли другой подход для решения этой проблемы? ТИА.

Примечание. Это проблема двух строк в hackerEarth.

Я разделил входной массив из двух строк. И затем я преобразовал каждое ключевое слово в массив символов. С помощью цикла for я просматривал каждое ключевое слово в S1, чтобы соответствовать массиву S2.

class TestClass {
public static void main(String args[] ) throws Exception {

    Scanner s = new Scanner(System.in);
    int cases=s.nextInt();

    for(int i=0;i<cases;i++){   //for multiple lines


        String name1=s.nextLine();
        String name2=s.nextLine();

        char[] n1=name1.toCharArray();
        char[] n2=name2.toCharArray();

        boolean match=false;

            for(int j=0;j<n1.length;j++){

                for(int k=0;k<n2.length;k++){

                    if(n1[j]==n2[k]){
                        match=true;
                        break;
                    }
                    else{
                        match=false;
                    }

                }
            }
        System.out.println(match);
    }
  }
}

Ввод - маджну джамну

ожидается - верно Фактический - Ложь

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

Есть несколько проблем с вашим кодом:

  1. Возможно, у вас проблема с чтением ввода. Если вы жестко запрограммировали проверенные вами входные данные (т. Е. String name1="majnu"; String name2="jamnu";), ваша программа выведет true. Это неудивительно, если вы попытаетесь прочитать каждый String с помощью nextLine(), даже если они введены в одной строке.

  2. Вы не учитываете множественные вхождения одного и того же персонажа. Ваша программа вернет true для abbbb и baa.

  3. Ваша программа имеет квадратичную (т. Е. O(n^2)) сложность времени. Это может быть сделано с линейной сложностью, если вы поддерживаете HashMap, который считает вхождения каждого символа в первом слове и сравнивает второе слово с этим Map.

0 голосов
/ 02 июля 2019

в одну строку:

String s1 = "majnu", s2 = "jamnu";
Arrays.equals( s1.chars().sorted().toArray(), s2.chars().sorted().toArray() );  // <— true

для задачи, по-видимому, ищется решение с картой:

countMap сопоставляет коды ASCII с соответствующим числом вхождений: *

Function<String,Map<Integer, Integer>> countMap = (s) -> s.codePoints().boxed().collect(
    Collectors.toMap( Function.identity(), value -> 1, Integer::sum ) );

*) аналогичная задача отлично описана здесь countMap.apply( "majnu" ).equals( countMap.apply( "jamnu" ) ); // <— true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...