Advertisement
Guest User

Untitled

a guest
Dec 12th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. WITH test (expr) AS (
  2. /*incorrect*/
  3. SELECT '((((a)g)q)' FROM dual UNION ALL
  4. SELECT 'z)(s)(' FROM dual UNION ALL
  5. SELECT '(((f)e)w))(h(g(w))' FROM dual UNION ALL
  6. SELECT ')(()' FROM dual UNION ALL
  7. SELECT '()))' FROM dual UNION ALL
  8. SELECT '(()()(()' FROM dual UNION ALL
  9. /*correct*/
  10. SELECT '(()((())()))' FROM dual UNION ALL
  11. SELECT '((t)!!er(q(qer()g)ffd())///)' FROM dual UNION ALL
  12. SELECT '(5 + x) * (y + 1) <= 10^(z + 2)' FROM dual UNION ALL
  13. SELECT '(((())))' FROM dual UNION ALL
  14. SELECT 'ффффвфывьав' FROM dual UNION ALL
  15. SELECT '(()()()())' FROM dual
  16. )
  17. SELECT expr, (SELECT MIN(INSTR(expr, ')', 1, level) - INSTR(expr, '(', 1, level))
  18. FROM dual
  19. CONNECT BY INSTR(expr, ')', 1, level) != 0
  20. OR INSTR(expr, '(', 1, level) != 0)
  21. FROM test
  22. WHERE
  23. /* Количество открывающих равно количеству закрывающих */
  24. (SELECT COUNT(SUBSTR(expr, level, 1))
  25. FROM dual
  26. WHERE SUBSTR(expr, level, 1) = '('
  27. CONNECT BY level <= LENGTH(expr))
  28. =
  29. (SELECT COUNT(SUBSTR(expr, level, 1))
  30. FROM dual
  31. WHERE SUBSTR(expr, level, 1) = ')'
  32. CONNECT BY level <= LENGTH(expr))
  33. /* Level-тая закрывающая скобка всегда правее level-той открывающей */
  34. AND
  35. (SELECT MIN(INSTR(expr, ')', 1, level) - INSTR(expr, '(', 1, level))
  36. FROM dual
  37. CONNECT BY INSTR(expr, ')', 1, level) != 0
  38. OR INSTR(expr, '(', 1, level) != 0)
  39. >= 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement