Я пытаюсь написать метод, который определяет вложенные пары круглых скобок в строке. Примеры: "(())" истинно "((4))" false "()()" false "((())" false
public static boolean nestedBrackets(String s){
if(s.length()<4){
return false;
}
else if(s.charAt(0) == '('&&s.charAt(s.length()-1)== ')'){
if(s.charAt(1)=='('&&s.charAt(s.length()-2)==')'&&s.length()==4){
return true;
}
else if(s.charAt(2)=='(' && s.charAt(s.length()-3)==')'&&s.length()==6){
return true;
}
else {
return false;
}
}
else {
return false;
Поскольку ваш вопрос помечен как "рекурсия", предлагается рекурсивное решение.
public static boolean nestedBrackets(String s)
{
if (s.length() < 2)
{
return false;
}
if (s.charAt(0) != '(')
{
return false;
}
if (s.charAt(s.length() - 1) != ')')
{
return false;
}
if (s.length() == 2)
{
return true;
}
return nestedBrackets(s.substring(1, s.length() - 1));
}
Реализация прост. С каждой рекурсией убедитесь, что все выражение находится в круглых скобках, а затем запишите содержимое в круглых скобках. Конечное условие достигается для одной пары круглых скобок: "()".
Примечание. Вы не укажете ожидаемый результат для пустого флага (""). Вышеприведенное ниже решение возвращает false
для пустой строки.
Чтобы сделать это рекурсивно, нам нужно подумать об индукции. Итак, мои базовые случаи:
Мой индуктивный шаг:
начните с левой стороны и найдите первый (если я найду a), тогда верните false
начинать с правой и находить первый), если я найду (return false
если я нахожу (слева и справа) справа, а затем сжимаю строку до подстроки между ними и рекурсивно.
Итак, псевдоид будет выглядеть так:
Public Boolean ParenFinder(String testString){
int left = 0;
int right = 0;
for (int i = 0; i < testString.length(); i++){
if (testString.charAt(i) == '('){
left = i;
break;
}
if (testString.charAt(i) == ')'){
return false;
}
}
for (int i = testString.length(); i > 0; i--){
if (testString.charAt(i) == ')'){
right = i;
break;
}
if (testString.charAt(i) == '('){
return false;
}
}
if (left == 0 && right == 0 && testString.charAt(0) != '(')
return true;
return (ParenFinder(testString.subString(left, right));
}