Соответствие шаблону для соответствия самой длинной подстроки - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть это регулярное выражение D+U.

Он должен совпадать один раз для следующей строки UDDDUDUU, но с Java он совпадает три раза. Это соответствует DDDU DU. Я использую https://regex101.com/ для проверки моего регулярного выражения, и оно должно совпадать только один раз, DDDU.

Я пытаюсь решить эту проблему HackerRank . Я также пытаюсь использовать Pattern, потому что я хочу попрактиковаться в использовании этих классов.

Что именно я делаю не так?

Это мой код:

static int match(int n, String s) {
    Matcher matcher = Pattern.compile("D+U").matcher(s);
    int count = 0;
    int i = 0;
    while (matcher.find(i)) {
        count++;
        i = matcher.end() + 1;
    }
    return count;
}

1 Ответ

0 голосов
/ 15 сентября 2018

Регулярное выражение + соответствует одному или нескольким предыдущим символам / регулярным выражениям.Так что это будет соответствовать любой последовательности D и U.

Если вы хотите вернуть самое длинное совпадение, которое вы можете сделать:

static String match(String s) {
    ArrayList<String> matches = new ArrayList<>();
    Matcher matcher = Pattern.compile("D+U").matcher(s);
    int i = 0;
    while (matcher.find(i)) {
       matches.add(matcher.group());
       i = matcher.end();
    }   
    return Collections.max(matches, Comparator.comparing(c -> c.length()));
}

Который (с контрольным примером UDDDUDUU) возвращает DDDU.Также обратите внимание, что я удалил параметр n, поскольку вы никогда не использовали его

...