Oracle SQL рдореЗрдВ рдХреЛрд╖реНрдардХ рдХреА рдЧрд┐рдирддреА


рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ рдХрд┐ рдЕрдЧрд▓реЗ рдХреЛрдбрдлреЛрд░реНрд╕ рд░рд╛рдЙрдВрдб рдореЗрдВ рд╕рд╛рдЗрдЯ codeforces.ru рдкрд░ рдореИрдВрдиреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдкрд╣реЗрд▓реА "рдмреНрд░реИрдХреЗрдЯ рдЕрдиреБрдХреНрд░рдо" рджреЗрдЦреА рдФрд░ рдореИрдВ рдЗрд╕реЗ "рдирд┐рд░реНрдмрд╛рдз рддрд░реАрдХреЗ рд╕реЗ" рд╣рд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ "" (",") "," ["рдФрд░"] "рд╕рд╣реА рдХреЛрд╖реНрдардХ рдЕрдиреБрдХреНрд░рдо рдЬрд┐рд╕рдореЗрдВ" рдХреЛрд╖реНрдардХ "рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдХреЛрд╖реНрдардХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рд╕рдкрд╛рдЯ рд░реЗрдЦрд╛ рдХреЛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╢реНрд░реЗрдгреАрдмрджреНрдз рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ:

with brackets as (select '[[)]([][][][[()[()[()()]]]])]' b from dual) select substr(b,level,1) q, level curr_pos, level - 1 prev_pos from brackets connect by substr(b,level,1) is not null 

рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рдФрд░ рдмреНрд░реИрдХреЗрдЯ, рд╡рд░реНрддрдорд╛рди рдмреНрд░реИрдХреЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдкрд┐рдЫрд▓реЗ рдмреНрд░реИрдХреЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реЛрдЧреАред рдЗрд╕рд╕реЗ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рд╕рднреА рд╕рд╣реА рдмреНрд░реИрдХреЗрдЯ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдпрд╣рд╛рдВ рдорд╕реНрддреА рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред
рдЪреВрдВрдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рд╢реБрджреНрдзрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдЯреИрдХ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрд╖реНрдардХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХ "рдЪрд╛рд▓" рдкрд░ рдЬрд╛рдирд╛ рдерд╛ред

"(" рдпрд╛ "[" (рдмрд╛рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИрдВ) рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдХреНрд░рдореЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред рдкреНрд░рддреНрдпреЗрдХ рдРрд╕реЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдФрд░ рдЕрдВрддрд┐рдо рдХреЛрд╖реНрдардХ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЕрдВрддрд┐рдо рдмреНрд░реИрдХреЗрдЯ рдХреЗ "рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░" рд╕реНрддрд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣реИ:
 "" ("1 - рд╕реНрддрд░"
      "" ("2 - рд╕реНрддрд░"
       редредтАж .. редред 
       "]" "рджреНрд╡рд┐рддреАрдп - рд╕реНрддрд░"
 ..тАж ..тАж



 with brackets as (select '[[)]([][][][[()[()[()()]]]])]' b from dual) , all_brackets as (select substr(b,level,1) q, level curr_pos, level-1 prev_pos from brackets connect by substr(b,level,1) is not null) select replace(sys_connect_by_path(q,'-'), '-') str, q, connect_by_root(curr_pos) start_pos, curr_pos end_pos, sum( case when (q = '(' or q = '[') and (prior q is null) then 1 when (q = '(' or q = '[') and (prior q = '(' or prior q = '[') then 1 when (q = '(' or q = '[') and (prior q = ']' or prior q = ')') then 0 when (q = ')' or q = ']') and (prior q = '(' or prior q = '[') then 0 when (q = ')' or q = ']') and (prior q = ')' or prior q = ']') then -1 end) over (partition by connect_by_root(curr_pos) order by connect_by_root(curr_pos), curr_pos) bracket_level from all_brackets connect by prior curr_pos = prev_pos start with q = '(' or q = '[' 

рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо "рдХреАрдЯ" рдмреНрд░реИрдХреЗрдЯ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреНрд░рдо рд╕реЗ рд╕рд╣реА рдЕрдиреБрдХреНрд░рдо рдмрдирд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рд╕рднреА рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ, рдФрд░ рдЬрдм рдЕрдЧрд▓рд╛ рдХреЛрд╖реНрдардХ "рдкреНрд░рдХрдЯ" рд╣реЛрдЧрд╛, рддреЛ рд╣рдо рдкрд┐рдЫрд▓реЗ рдХреЛрд╖реНрдардХ рдкрд╛рдПрдВрдЧреЗ, рдЬреЛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдПрдХ рдХреЗ рд╕рдорд╛рди рд╕реНрддрд░ рдкрд░ рд╣реИ (рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдУрд░реЗрдХрд▓ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж)ред рдирд┐рдореНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рд╕реНрддрд░ рдкрд░ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдЧрд▓рдд рдЕрдиреБрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

рдЗрд╕ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдХреЛрдИ рднреА рдЙрджреНрдШрд╛рдЯрди рдмреНрд░реИрдХреЗрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЛ "рддреЛрдбрд╝" рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред

 with brackets as (select '[[)]([][][][[()[()[()()]]]])]' b from dual) , all_brackets as (select substr(b,level,1) q, level curr_pos, level - 1 prev_pos from brackets connect by substr(b,level,1) is not null), brackets_comb as (select replace(sys_connect_by_path(q,'-'), '-') str, q, connect_by_root(curr_pos) start_pos, curr_pos end_pos, sum( case when (q = '(' or q = '[') and (prior q is null) then 1 when (q = '(' or q = '[') and (prior q = '(' or prior q = '[') then 1 when (q = '(' or q = '[') and (prior q = ']' or prior q = ')') then 0 when (q = ')' or q = ']') and (prior q = '(' or prior q = '[') then 0 when (q = ')' or q = ']') and (prior q = ')' or prior q = ']') then -1 end) over (partition by connect_by_root(curr_pos) order by connect_by_root(curr_pos), curr_pos) bracket_level from all_brackets connect by prior curr_pos = prev_pos start with q = '(' or q = '[') select start_pos, end_pos, str, case when q = ')' and lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) = '(' then 'ok' when q = '(' and lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) = ')' then 'ok' when q = '(' and lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) = ']' then 'ok' when q = ']' and lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) = '[' then 'ok' when q = '[' and lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) = ']' then 'ok' when q = '[' and lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) = ')' then 'ok' when lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) is null and bracket_level > 0 then 'ok' else 'not ok!' end status from brackets_comb bc 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ (start_pos) рдкрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреЛрд╖реНрдардХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдореЗрдВ рдкрд╣рд▓рд╛ рдЧрд▓рдд рдЕрдиреБрдХреНрд░рдо рдорд┐рд▓рд╛ред
рдЕрдиреБрдХреНрд░рдо рдХреЗ рдРрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯ рдореЗрдВ, "рдЧрд▓рдд" рдПрдХ рдХреЗ рдмрд╛рдж рдЕрдиреБрдХреНрд░рдо рдХреЛ "рдмрд╛рд╣рд░ рдлреЗрдВрдХ", рдФрд░ рд╢реЗрд╖ рд╕рднреА рдХреЗ рд▓рд┐рдП, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдЬреЛ рдмреНрд░реИрдХреЗрдЯ рдЦреБрд▓ рдЧрдП рд╣реИрдВ рд╡реЗ рдмрдВрдж рд╣реЛ рдЧрдП рд╣реИрдВ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЦреБрд▓рдиреЗ рдФрд░ рдмрдВрдж рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдмреНрд░реИрдХреЗрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ)ред
рдирддреАрдЬрддрди, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдХ, рдФрд░ рд╢рд╛рдпрдж рдПрдХ рд╣реА рдирд╣реАрдВ, рдЙрд╕рдХреА (рдирд╣реАрдВ, рдЖрдкрдХреЗ рд╕рдкрдиреЛрдВ рдХреА рд▓рдбрд╝рдХреА рдирд╣реАрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ), "[" рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдмреНрд░реИрдХреЗрдЯ рдЕрдиреБрдХреНрд░рдоред

рд╕рднреА рдЕрдиреБрд░реЛрдз:

 with brackets as (select '[[]])[([[]][[(]])]' b from dual) , all_brackets as (select substr(b,level,1) q, level curr_pos, level - 1 prev_pos from brackets connect by substr(b,level,1) is not null), brackets_comb as (select replace(sys_connect_by_path(q,'-'), '-') str, q, connect_by_root(curr_pos) start_pos, curr_pos end_pos, sum( case when (q = '(' or q = '[') and (prior q is null) then 1 when (q = '(' or q = '[') and (prior q = '(' or prior q = '[') then 1 when (q = '(' or q = '[') and (prior q = ']' or prior q = ')') then 0 when (q = ')' or q = ']') and (prior q = '(' or prior q = '[') then 0 when (q = ')' or q = ']') and (prior q = ')' or prior q = ']') then -1 end) over (partition by connect_by_root(curr_pos) order by connect_by_root(curr_pos), curr_pos) bracket_level from all_brackets connect by prior curr_pos = prev_pos start with q = '(' or q = '['), brackets_comb_status as (select start_pos, end_pos, str, case when q = ')' and lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) = '(' then 'ok' when q = '(' and lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) = ')' then 'ok' when q = '(' and lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos ) = ']' then 'ok' when q = ']' and lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) = '[' then 'ok' when q = '[' and lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) = ']' then 'ok' when q = '[' and lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) = ')' then 'ok' when lag(q) over (partition by start_pos, bracket_level order by start_pos, bracket_level, end_pos) is null and bracket_level > 0 then 'ok' else 'not ok!' end status from brackets_comb bc) select str "", cnt " [", start_pos " ", end_pos " " from ( select str, start_pos, end_pos, length(regexp_replace(str,'[\)\(]',''))/2 cnt, max(length(regexp_replace(str,'[\)\(]',''))/2) over (order by null) best_cnt from ( select str, start_pos, end_pos, nvl( lag( case when status = 'ok' then null else status end ignore nulls) over (partition by start_pos order by start_pos, end_pos), status ) status from brackets_comb_status ) where status = 'ok' and length(replace(str,'[','')) = length(replace(str,']','')) and length(replace(str,'(','')) = length(replace(str,')','')) ) result where best_cnt = cnt 

Source: https://habr.com/ru/post/In151895/


All Articles