2016-08-21 3 views
0

Может ли кто-нибудь предложить лучший оптимизированный способ решить эту загадку для кодирования? Я использовал кучу утверждений if, и мне сказали, что просто увеличена циклическая сложность. Является ли решение регулярным выражением или структурой данных (например, стеком)? Любая обратная связь очень ценится.Valid Parens method - Java

/** 
* Write a function that will take a string as input and output 
* a boolean (true or false) that describes if the string has valid parens. 
* 
* Use Cases: 
* 
* "" -> false 
* 
* null -> false 
* 
* "()" -> true 
* 
* ")" -> false 
* 
* "(" -> false 
* 
* "(())" -> true 
* 
* "())(" -> false 
* 
* "()))" -> false 
* 
* ")(" -> false 
* 
* "()()" -> true 
*/ 
public boolean validParen(String input) { 
    // implementation? 
} 
+0

Попробуйте написать функцию, которая выполняет следующую операцию: '(состояние, символ) -> state', где' state' содержит информацию об уже обработанный 'input' (по крайней мере, его правильность), а' symbol' - следующий символ 'input'. – user3707125

+0

Что он должен вернуть, если найден персонаж без паренса? – Andreas

+0

Я начал бы с рассмотрения каждого символа, считая количество левых ** (** и правых **) ** (отдельно) (очевидно, начиная с начала строки до конца). Если результат равен 0, false. Если результат тот же, что и не false. Однако, если число прав больше, чем левых, то сразу же ложь. Не полностью проверили действительность, но это начало. Это будет использовать цикл. – MikeT

ответ

1

Вам просто нужен счетчик.

Если ввод пустой или пустой строки, верните false.

Затем итерации символов строки и приращение счетчика, когда вы видите (, и уменьшите счетчик, когда увидите ).

Если вы видите ), а счетчик равен нулю, верните значение false.
Если счетчик не равен нулю в конце, верните значение false.
В противном случае верните true.

2

Чтобы проверить, действительны ли скобки (попарно), вам не нужна структура данных. Просто увеличивайте переменную счетчика, когда вы сталкиваетесь с (и уменьшаете ее при обнаружении пары). В конце счетчик должен = 0, если (а) уравновешены:

static boolean check(String toCheck) { 
    if (toCheck == null || toCheck.equals("")) 
     return false; 
    int count = 0; 
    for (int i = 0; i < toCheck.length(); i++) { 
     char c = toCheck.charAt(i); 
     if (c == '(') { 
      count++; 
     } else if (c == ')') { 
      if (count == 0) 
       return false; 
      count--; 
     } 
    } 
    return count == 0; 
} 
+1

Это не выполняется для следующих значений: 'null',' "", '") ("' и т. Д. Кроме того, почему бы не использовать цикл 'for'? – Andreas

+0

@Andreas, очевидно, я не рассматривал все варианты использования , отредактированный в соответствии с вашим предложением, спасибо за исправление. –

+0

'toCheck.equals (" ")' лучше написано как 'toCheck.isEmpty()'. – Andreas