2016-01-19 4 views
-2

Так что я пытаюсь изучить Java, и я застрял в задании. В задании запрашивается нечто похожее на то, сбалансирована ли строка или нет, со странным завихрением. Он может возвращать true только в том случае, если все открытые круглые скобки начинаются до закрытой круглой скобки.Как проверить, сбалансированы ли скобки (с завихрением)

True:

((()))

(())

()

Ложные:

()()

(())()

Я уже закодировал только обычную «проверку, если сбалансирован», но я не понимаю, как добавить этот маленький поворот. Я действительно только разобрался с основами, поэтому я не очень разбираюсь в таких вещах, как массив и тому подобное, помощь будет очень признательна.

+4

Вы упомянули, что у вас есть код, который вы можете включить в него? –

+0

попробуйте '^ \\ (+ \\) + $', но он не будет проверять наличие сбалансированного –

+4

[Вопросы, требующие помощи в домашней работе ** должны включать *** резюме работы, которую вы сделали до сих пор для решения проблемы ***, и *** описание трудности, с которой вы решаете ее ***.] (http://stackoverflow.com/help/on-topic). Пожалуйста, отредактируйте ваше сообщение, прежде чем оно будет закрыто. – Pshemo

ответ

0

Вероятно, не самое лучшее решение, но из примеров вы предоставили, это работает

String pattern = "((((()))))"; 
    char matcher = '('; 
    int count = 0; 

    for (char c : pattern.toCharArray()) { 
     if (c == matcher) count++; 
    } 


    for (int i = 0; i < pattern.length(); i++) { 
     if (pattern.charAt(i) == ')' && i < count) { 
      System.out.println("UNBALANCED"); 
     } 
    } 

Это только для закручивания, что вы заявили. Вероятно, вы захотите использовать регулярное выражение для чего-то подобного.

0

Вы можете использовать Javas Pattern Matching!

String test1 = "((()))"; 
String test2 = "()"; 
System.out.println(test1.matches("\\(+\\)+")); // Should Return True 
System.out.println(test2.matches("\\(+\\)+")); // Should Return True 

String test3 = "()()"; 
String test4 = "(())()"; 
System.out.println(test3.matches("\\(+\\)+")); // Should Return False 
System.out.println(test4.matches("\\(+\\)+")); // Should Return False 

Чтобы пояснить регулярное выражение "\ (+ \) +". Сначала вам нужно определить, когда его открыть, используя «\ (+», + означает один или несколько. Затем вам нужно определить, когда он закрыт, используя «\) +». Причина, по которой я использую \, используется, потому что вам нужен escape (и), потому что они являются конструкциями в шаблонах Java, и вы просто хотите, чтобы они были нормальными символами в строке.

0

Используйте ArrayDeque.

Внутри блока try, когда вы сталкиваетесь с левыми односторонними скобками, надавите на них сверху. Когда вы сталкиваетесь с правосторонней скобкой, каждый раз удаляйте элемент с Deque. Если слишком много правых односторонних скобок или они идут перед левыми односторонними, вы получите NoSuchElementException, и вы знаете, что ограничение не сработало. Поймать исключение и вернуть false. Если вы дойдете до конца строки и ArrayDeque не пуст (скобки не все закрыты), верните false. В противном случае верните true.