Как разбить строку на массив, если выполняется условие .contains ()? - PullRequest
0 голосов
/ 11 октября 2018

Я делаю хакерранкский средний вызов для взломщика паролей.Я хочу иметь возможность проверить, содержит ли данная строка attempt все слова в pass.pass - это массив паролей, а attempt - это конкатенация случайных записей в pass.Если attempt содержит ТОЛЬКО слова, которые найдены как записи в pass, то это считается хорошим паролем, и слова из ввода attempt, ограниченные пробелами, печатаются.

Пример ввода

3                                        //3 attempts
6                                        //6 words for attempt 1
because can do must we what              //pass[]
wedowhatwemustbecausewecan               //attempt
2                                        //...
hello planet
helloworld
3
ab abcd cd
abcd

Ожидаемый результат

we do what we must because we can
WRONG PASSWORD                           //Because planet is not in pass[]
ab cd

Код

public class Solution {

static String passwordCracker(String[] pass, String attempt) {
    int arrayLength=pass.length;       

    int accuracy=0;
    String trips_array[] = new String[pass.length];

    String [] newWord = new String[20];

    for (int i=0; i<pass.length;i++)
    {
       // int j=0;
       String[] arr = pass[i].split(" ");  
        //-------------------------------
        if (attempt.contains(pass[i]))
        {

            accuracy++;
            newWord[i] = pass[i];
            trips_array[i] = attempt.split(" ");
        }
          //------------------------------
    }

    StringBuilder sb = new StringBuilder();
    for (String words : trips_array) {
            sb.append(words);
        }
    for (int i=0; i<pass.length;i++)
    {
        if (accuracy==pass.length)
                  return sb.toString() + " ";

        else
            return "WRONG PASSWORD";
    }
    return "test";
}

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    for(int a0 = 0; a0 < t; a0++){
        int n = in.nextInt();
        String[] pass = new String[n];
        for(int pass_i = 0; pass_i < n; pass_i++){
            pass[pass_i] = in.next();
        }
        String attempt = in.next();
        String result = passwordCracker(pass, attempt);
        System.out.println(result);
    }
    in.close();
}
}

Частьв центре внимания находится часть в разделе комментариев // -----------------.По сути, моя цель - выяснить, содержит ли попытка правильные записи в pass, и если да, сохранить эту подстроку attempt (или аналогично записи в pass) в новый массив, который можно распечататьв правильном порядке.Если вы проверите ожидаемый результат выше, вы увидите, что он такой же, как attempt , за исключением пробелов .

По сути, мне нужно найти разрывы в словах attempt и напечатать, что, если оно удовлетворяет вышеуказанным требованиям (первый абзац).

См. Это для получения более подробной информации https://www.hackerrank.com/challenges/password-cracker/problem

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Ваш for цикл выглядит слишком сложным, вот как я бы подошел к этой части.

boolean isAllWords = true;
int checksum = 0;
for (int j = 0; j < pass.length; j++) {
    if  (!attempt.contains(pass[j]) {
       isAllWords = true;
       break;
    }
    checksum += pass[j].length;
}

if (isAllWords && checksum == attempt.length) {
   //This means attempt contains all words in pass array and nothing more
   //... handle successful attempt
} else {
  //... handle bad attempt
}
0 голосов
/ 11 октября 2018

Если вам это поможет

    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    int testNumb = Integer.parseInt(reader.readLine());

    List<String> passList = new ArrayList<>();
    List<String> attList = new ArrayList<>();

    for (int i = 0; i < testNumb; i++) {
        reader.readLine();
        passList.add(reader.readLine());
        attList.add(reader.readLine());
    }
    reader.close();

    for (int i = 0; i < testNumb; i++) {

        String s1 = passList.get(i);
        String s2 = attList.get(i);

        StringBuilder sb = new StringBuilder();
        String[] s1Arr = s1.split(" ");
        while (s2.length() > 0) {
            int s2Lenght = s2.length();
            for (String s : s1Arr) {
                if (s2.startsWith(s)) {
                    sb.append(s + " ");
                    s2 = s2.substring(s.length());
                }
            }
            if (s2.length() == s2Lenght) {
                sb = new StringBuilder("wrong pass");
                break;
            }
        }
        System.out.println(sb.toString());
    }
...