Найти подпоследовательность в строке - PullRequest
2 голосов
/ 06 апреля 2019

Я решал этот набор испытаний на Hackerrank, ссылка: Hackerrank in String

Я создал свой алгоритм, который выглядит следующим образом:

  1. Чтобы проверить, имеет ли он по крайней мере два a, r и k согласно строке хакерранка
  2. Проверьте, что он содержит следующие символы h, a, c, k, e, r, n,k
  3. пусть p [0], p (1), p [2] ....., p [9] - соответствующие индексы h, a, c, k, e, r, rв строке.Если p [0]

Я знаю, что это очень плохо,и вывод также не приходит из-за этой ошибки: Terminated due to timeout

КОД:

У меня есть метод с именем hackerrankInString(String s), он возвращает «ДА» или«НЕТ» строка

// Complete the hackerrankInString function below.
static String hackerrankInString(String s) {
  int countR = 0, countA = 0, countK = 0;
  //for reading multi-line inputs, it will perform operation individually 
  // on the inputs
  while(scanner.hasNextLine()){
    for(int i=0; i < s.length(); i++){
      if(s.charAt(i) == 'r')
        countR++;

      if(s.charAt(i) == 'a')
        countA++;

      if(s.charAt(i) == 'k')
        countK++;
    }

    //It should atleast have two As, two Rs, and two Ks
    if(countR >= 2 && countA >= 2 && countK >= 2){
      //If the string contains hackerrank
      if(s.contains(Character.toString('h')) && s.contains(Character.toString('a'))  && s.contains(Character.toString('c')) && s.contains(Character.toString('k')) && s.contains(Character.toString('e')) && s.contains(Character.toString('r')) &&    s.contains(Character.toString('n'))){
          if((s.indexOf('h') > s.indexOf('a')) && (s.indexOf('h') > s.indexOf('c')) && (s.indexOf('h') > s.indexOf('k')) && (s.indexOf('h') > s.indexOf('e')) && (s.indexOf('h') > s.indexOf('r')) && (s.indexOf('h') > s.lastIndexOf('r')) && (s.indexOf('h') > s.lastIndexOf('a')) && (s.indexOf('h') > s.indexOf('n')) && (s.indexOf('h') > s.lastIndexOf('k'))){
              if((s.indexOf('a') > s.indexOf('c')) && (s.indexOf('a') > s.indexOf('k')) && (s.indexOf('a') > s.indexOf('e')) && (s.indexOf('a') > s.indexOf('r')) && (s.indexOf('a') > s.lastIndexOf('r')) && (s.indexOf('a') > s.lastIndexOf('a')) && (s.indexOf('a') > s.indexOf('n')) && (s.indexOf('a') > s.lastIndexOf('k'))){
                  if((s.indexOf('c') > s.indexOf('k')) && (s.indexOf('c') > s.indexOf('e')) && (s.indexOf('c') > s.indexOf('r')) && (s.indexOf('c') > s.lastIndexOf('r')) && (s.indexOf('c') > s.lastIndexOf('a')) && (s.indexOf('c') > s.indexOf('n')) && (s.indexOf('c') > s.lastIndexOf('k'))){
                      if((s.indexOf('k') > s.indexOf('e')) && (s.indexOf('k') > s.indexOf('r')) && (s.indexOf('k') > s.lastIndexOf('r')) && (s.indexOf('k') > s.lastIndexOf('a')) && (s.indexOf('k') > s.indexOf('n')) && (s.indexOf('k') > s.lastIndexOf('k'))){
                        if((s.indexOf('e') > s.indexOf('r')) && (s.indexOf('e') > s.lastIndexOf('r')) && (s.indexOf('e') > s.lastIndexOf('a')) && (s.indexOf('e') > s.indexOf('n')) && (s.indexOf('e') > s.lastIndexOf('k'))){
                            if((s.indexOf('r') > s.lastIndexOf('r')) && (s.indexOf('r') > s.lastIndexOf('a')) && (s.indexOf('r') > s.indexOf('n')) && (s.indexOf('r') > s.lastIndexOf('k'))){
                                if((s.lastIndexOf('r') > s.lastIndexOf('a')) && (s.lastIndexOf('r') > s.indexOf('n')) && (s.lastIndexOf('r') > s.lastIndexOf('k'))){
                                    if((s.lastIndexOf('a') > s.indexOf('n')) && (s.lastIndexOf('a') > s.lastIndexOf('k'))){
                                        if(s.indexOf('n') > s.lastIndexOf('k')){
                                            return "YES";
                                        }
                                    }
                                }
                            }
                        }
                      }
                  }
              }
          }
        }
      }
    }

    return "NO";
}

Пожалуйста, помогите мне с этим, я хочу выучить два урока,

  • Как решить эту задачу
  • Как решить моюЭффективное третье утверждение алгоритма

Буду признателен за любую помощь.

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Вы можете использовать регулярное выражение для решения проблемы:

static String hackerrankInString(String input) {
    final String regexHack = ".*h.*a.*c.*k.*e.*r.*r.*a.*n.*k.*";
    return input.matches(regexHack) ? "YES" : "NO";
}

Позвоните, используя:

System.out.println(hackerrankInString("hhaacckkekraraannk"));  // YES
System.out.println(hackerrankInString("hackerworld"));         // NO

Вы можете попробовать регулярное выражение здесь .

1 голос
/ 06 апреля 2019

Не было много времени, чтобы проверить, но может выглядеть примерно так

public static String solve(String startWord, String givenWord) {
    for(int i = 0; i < startWord.length(); i++) {
        String letter = startWord.substring(i, i + 1);
        int index = givenWord.indexOf(letter);
        if(index == -1) {
            return "NO";
        } else {
            givenWord = givenWord.substring(index + 1, givenWord.length());
        }
    }

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