проверить, сформирована ли строка с использованием указанного набора правил или нет

Проверьте, сформирована ли строка с использованием указанного набора правил или нет. Генерируется с помощью следующих правил:

a. строка начинается с ‘a’

b. за каждым » a «не следует ничего или» a » или » bb»

c. за каждым «bb» следует ничто или «a»

Я попробовал следующий код:

public static void main(String[] args) {

    Scanner scn = new Scanner(System.in);
    String str = scn.nextLine();
    boolean b = false;
    if (str.charAt(0) == 'a') {
        if (str.charAt(1) == 'b') {
            if (str.charAt(2) == 'b') {
                b = true;
            } else
                b = false;

        } else
            b = false;
    } else
        b = false;
    System.out.println(b);
}

это код все в порядке…???
Для input = aab выход должен быть ложным, а для input =abba выход должен быть истинным.

1 ответ

  1. Если регулярные выражения разрешены, шаблон (a+(bb)?)+соответствует строкам, которые следуют правилу (и не соответствует строкам, которые не соответствуют).

    В противном случае ваш подход не может работать без какого-то цикла, потому что строка aaaaaaaaaaaсоответствует шаблону.

    Рассмотрим следующий метод, который должен обрабатывать его.

    private static boolean stringMatches(String s) {
      // Handle empty and null cases first.
      if (s == null || s.isEmpty()) return false;
    
      // So long as the string continues to match the pattern, keep stripping
      // characters from it until it is empty. If you reach empty, it matches the pattern.
      while (! s.isEmpty()) {
        // If the first character isn't 'a', we don't match; return false.
        if (s.charAt(0) != 'a') {
          return false;
        }
    
        // Check for abb, if so strip all of that, otherwise strip just the a
        if (s.length() >= 3 && "abb".equals(s.substring(0,3)) {
          s = s.substring(3);
        } else {
          s = s.substring(1);
        }
      }
      // Reached empty string, return true.
      return true;
    }