Любой другой более короткий способ решить эту проблему с помощью рекурсии - PullRequest
0 голосов
/ 25 января 2020

Предположим, у вас есть строка, состоящая только из 'a' и 'b'. Напишите рекурсивную функцию, которая проверяет, была ли строка сгенерирована с использованием следующих правил: 1. Строка начинается с «a» 2. За каждым «a» ничего не следует, ни «a», ни «bb» 3. Каждый «bb» "не содержит ничего или 'a' Если за всеми правилами следует заданная строка, верните true, в противном случае верните false.

public class temp {

    public static boolean checkAB(String input) {
        if (input.length() == 1) {
            if (input.charAt(0) == 'a')
                return true;
            else
                return false;
        }


        Boolean ans = checkAB(input.substring(0, input.length() - 1));
        if (ans == false)
            return ans;
        else {
            if (input.charAt(input.length() - 2) == 'a') {
                if (input.charAt(input.length() - 1) == 'a' || input.charAt(input.length() - 1) == 'b')
                    return true;
                else
                    return false;
            }
            if (input.charAt(input.length() - 2) == 'b') {
                if (input.charAt(input.length() - 3) == 'a') {
                    if (input.charAt(input.length() - 1) == 'b') {
                        return true;

                    } else
                        return false;
                }
                if (input.charAt(input.length() - 3) == 'b') {
                    if (input.charAt(input.length() - 1) == 'a') {
                        return true;

                    } else
                        return false;
                }


            } else
                return false;


        }
        return false;
    }
    public static void main(String args[]){
        System.out.println(checkAB("abbbabaaa"));
    }

}

Ответы [ 2 ]

1 голос
/ 25 января 2020

Я предлагаю этот шаблон: «a + (bba +) * (bb)?»

public class ABB
{
    public static void main(String[] args)
    {
        for (String arg : args)
            checkAB(arg) ;
    }

    static void checkAB(String s)
    {
        System.out.printf("%s -> %b\n", s, s.matches("a+(bba+)*(bb)?")) ;
    }
}
0 голосов
/ 25 января 2020

Что-то вроде:

 public boolean isValid(String str) {
    if (str.startsWith("a")) {
        final String substring = str.substring(1);
        return (substring.startsWith("a") || substring.startsWith("bb")) ? isValid(substring) : substring.isEmpty();

    } else if (str.startsWith("bb")) {
        final String substring = str.substring(2);
        return (substring.startsWith("a")) ? isValid(substring) : substring.isEmpty();

    } else {
        return false;
    }
}
...