powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Какие есть идеи? Нужна помощь в вариантах решения задачи.
43 сообщений из 43, показаны все 2 страниц
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480059
RomanBanan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попалась мне тут задачка следующего вида:
Для произвольной строки, состоящей из открывающих и закрывающих скобок написать запрос для вывода всех слов максимальной длины, представляющих правильные скобочные записи. Например, для строки (()(() ответ должен быть:
()()
(())

По идее на нее человек с начальными знаниями должен потратить от 20 мину до часа. Ну, решал я ее пару дней.
В итоге получился запрос из 11-и SELECT-ов.
В кратце последовательность следующая:
1) Хитрейшим способом находим все правильные скобочные последовательности максимальной длины для данной строки(соответствует числам Каталана).
2) В полученные последовательности впихиваем через символ -это (.*\)
3) Применяем все эти строки как регулярки к исходной строке.

Но что-то получается слишком жестко, наверняка есть более простые способы решить эту задачу, через регэкспы или еще как-то?
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480079
RomanBanan,

принцип получения результата не совсем понятен. раскрась цветом какие скобки из исходного множества попали в конечное и объясни словами, почему именно так, а не по другому.

Но в целом, есть подозрение, что задача сведется к банальному запросу по преобразованию "интервалов" в "конечные точки" с последующим заворачиваем этих самых "конечных точек" в новые "интервалы".
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480129
RomanBanan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

Для данной строки минимальное количество скобок в любую из сторон это 2. Следовательно все возможные варианты это (()) и ()().
Из исходного множества это (()(() и (()((). Далее превращаются в регэкспы '.*\(.*\(.*\).*\)' и '.*\(.*\).*\(.*\)'. Оба выражения к исходной строке подходят, следовательно являются ответами.
Но для строки посложнее например '((())(()' вариант '()(())' -> '.*\(.*\).*\(.*\(.*\).*\)' уже не подойдет и в результат не попадает.
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480160
Скобарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RomanBanan минимальное количество скобок
!=
RomanBanan всех слов максимальной длины, представляющих правильные скобочные записи
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480217
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomanBanan,

Можно ссылку на задачу посмотреть?
Почему так (()(() ответ должен быть:
()()
(()) а не так?:

() () ()
() (())
(()) ()


У Вас 6 скобок = 3 пары
Сочетания 2 из 3 - это С 23 = 3! / 2! (3-2)! = 2*3 / 2 = 3
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480231
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dba123,

() (())
(()) ()
((()))
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480281
RomanBanan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dba123,
dba123а не так?:

() () ()




Потому что в строке (()(() - две скобки влево, а в ()()() - три и по идее это не должно подойти к этому слову.
Ссылки на задачу нет, видимо некоторые задачи для нас придумываются по ходу.
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480292
vladimir74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomanBanandba123,
dba123а не так?:

() () ()




Потому что в строке (()(() - две скобки влево, а в ()()() - три и по идее это не должно подойти к этому слову.
Ссылки на задачу нет, видимо некоторые задачи для нас придумываются по ходу.
допустим, а почему тогда нет такого варианта ответа? ()
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480310
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimir74,
Имеется " (()(() ".

Бежим по символам до "(":
(()(()
Нашли начало -> Бежим до первой ")":
(()(()
Убираем все самволы "внутри".
Закончили с первым "отрезком" строки, продолжаем дальше в том же духе с остатком строки.

Бежим по символам до "(":
(()(()
Нашли начало -> Бежим до последней ")":
(()(()
Проверяем, что этот кусок not like "(%(%)%)"
Если not like, то откидываем всё, что внутри, если он лайк, то начинаем с начала только в рамках данного "отрезка".

В зависимости от бежим до первой ")" или бежим до последней ")" сформируем все возможные варианты.
Причём, когда мы проверяем 2ым способом, то "внутри" можно использовать и 1ый и 2ой варианты, результаты могут быть разные.
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480317
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomanBananПопалась мне тут задачка следующего вида:
Для произвольной строки, состоящей из открывающих и закрывающих скобок написать запрос для вывода всех слов максимальной длины, представляющих правильные скобочные записи. Например, для строки (()(() ответ должен быть:
()()
(())

По идее на нее человек с начальными знаниями должен потратить от 20 мину до часа. Ну, решал я ее пару дней.
В итоге получился запрос из 11-и SELECT-ов.
В кратце последовательность следующая:
1) Хитрейшим способом находим все правильные скобочные последовательности максимальной длины для данной строки(соответствует числам Каталана).
2) В полученные последовательности впихиваем через символ -это (.*\)
3) Применяем все эти строки как регулярки к исходной строке.

Но что-то получается слишком жестко, наверняка есть более простые способы решить эту задачу, через регэкспы или еще как-то?

Вопрос по алгоритмам - к математикам.

Лично я вижу, что в вашем случае подойдёт только полный перебор вложенных отрезков.
Алгоритмы комбинаторной механизации не подойдут, тк находят лишь единственное(оптимальное) решение.

полный перебор можно осуществить с помощью цикла(model, regexp и тп)
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480319
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kernA
Алгоритмы комбинаторной *механизации не подойдут

*оптимизации
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480338
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще не поняла задачу

()() - это откуда ответ ?


строка (()((), там нет подряд ()()
можно вкидывать символы ?
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480346
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поняла
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480347
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ozornitca,

Мы выкидываем все символы, которые не имеют "пару".
По сути, для (()(() ответ должен быть:
1) (()(()
2) (()(()
3) (()(()
4) (()(()
5) (()(()
6) ...
Если не distinctitь, то получится как раз

()()
(())
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480353
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooOzornitca,

Мы выкидываем все символы, которые не имеют "пару".
По сути, для (()(() ответ должен быть:
1) (()(()
2) (()(()
3) (()(()
4) (()(()
5) (()(()
6) ...
Если не distinctitь, то получится как раз

()()
(())

да я поняла поняла
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480358
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда надо регекспом вырезать повторяющиеся 2 и более раза символы,

в цикле отрезая постепенно строку с начала)))
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480394
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и потом подчистить с концов ))
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480397
_lLocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ozornitcaтогда надо регекспом вырезать повторяющиеся 2 и более раза символы,

в цикле отрезая постепенно строку с начала)))
1) Если в цикле вырезать хотя бы один из 2х повторяющихся симоволов (( из начала, то будет пропущен этот вариант (()), что не допустимо.
2) а для строки )()( врожде и нечего вырезать, а правильный ответ будет такой ()

не все так просто ))) (и если что эти скобки - не скобки, а смайлики ))) )
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480400
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ozornitcaтогда надо регекспом вырезать повторяющиеся 2 и более раза символы,

в цикле отрезая постепенно строку с начала)))

в строке вложенность может быть n, а не только 2
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480406
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kernAOzornitcaтогда надо регекспом вырезать повторяющиеся 2 и более раза символы,

в цикле отрезая постепенно строку с начала)))

в строке вложенность может быть n, а не только 2

а точно
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480407
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ozornitcaну и потом подчистить с концов ))

а в самом начале проверить на вырожденность:

))))))))))))))))))))))))))))))(((((((((((((((((((((((((((((((((
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480410
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а иерархическим запросом кк-то можно ? ну раз вложенность
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480451
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ozornitcaа иерархическим запросом кк-то можно ? ну раз вложенность

если паттерном задать правило вложенности отрезков, то можно
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480453
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kernAOzornitcaа иерархическим запросом кк-то можно ? ну раз вложенность

если паттерном задать правило вложенности отрезков, то можно

например,


алгоритм Фараха
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480485
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomanBanan,



нашёл, может поможет:


Правильные скобочные последовательности


RomanBananПо идее на нее человек с начальными знаниями должен потратить от 20 мину до часа.

* с хорошими знаниями Динамического программрования
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480503
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomanBanan,

В лоб: если левых скобок больше чем правых, то убираем число скобок равное разнице (в твоем примере это две скобки) и строим все возможные комбинации. Потом проверяем полученные строки на корректность.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SQL> with t(str) as (select '(()(()' from dual),
  2       permute(ord, str, delta)
  3       as (select level ord, str, length(replace(str, ')')) - length(replace(str, '(')) delta
  4             from t
  5           connect by level <= length(replace(str, ')'))),
  6       rec(lvl, ord, str)
  7       as (select 1, ord, regexp_replace(str, '\(', '', 1, ord)
  8             from permute p
  9           union all
 10           select rec.lvl + 1, p.ord, regexp_replace(rec.str, '\(', '', 1, p.ord - rec.lvl)
 11             from rec join permute p on p.ord > rec.ord
 12            where lvl < p.delta),
 13       candidates
 14       as (select distinct str
 15             from rec
 16            where rec.lvl = (select delta from permute where rownum = 1)),
 17       rec_check(iter, str, result)
 18       as (select 1, str, replace(str, '()') result from candidates
 19           union all
 20           select iter + 1, str, replace(result, '()') result
 21             from rec_check
 22            where iter < 2)
 23  select str
 24    from rec_check
 25   where iter = (select delta from permute where rownum = 1)
 26     and result is null;

STR
--------------------------------------------------------------------------------
(())
()()

В запросе надо допилить логику в permute и rec когда правых больше левых, я думаю ты справишься.
Не делать же за тебя лабу полностью.
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480522
Скобарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RomanBanan, так?

............/´¯/)..............(\¯`\...... ......
............/....//..............\\....\...........
.........../....//................\\....\..........
....../´¯/..../´¯\............/¯` ....\¯`\.....
..././.../..../..../.|_....._|.\....\....\...\.\..
(.(....(....(..../.)..).....(..(.\....)....)....).)
.\................\/.../....\...\/................/
..\................. /........\................../.
....\..............(............)............../...
......\.............\.........../............./....
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480526
RomanBanan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vladimir74,
допустим, а почему тогда нет такого варианта ответа? ()
Потому что в задании нужно найти последовательности максимальной длины.

Вообще для строки посложнее '((())(()' ответ будет:
(())()
((()))

А для строки '((()()((())(()' :
()()(())()
(())((()))
((())())()
((())(()))
((()()()))
(())(())()
((()()))()
()()((()))
(()()())()
(()()(()))
Осталось только понять на глаз все ли верны эти ответы или может какого не хватает)))
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480536
RomanBanan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

Да этот код вдвое компактнее моего, но для строки с более глубокой вложенностью это не работает например '((()()((())(()'
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480542
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomanBanandbms_photoshop,

Да этот код вдвое компактнее моего, но для строки с более глубокой вложенностью это не работает например '((()()((())(()'
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
SQL> with t(str) as (select '((()()((())(()' from dual),
  2       permute(ord, str, delta)
  3       as (select level ord, str, length(replace(str, ')')) - length(replace(str, '(')) delta
  4             from t
  5           connect by level <= length(replace(str, ')'))),
  6       rec(lvl, ord, str)
  7       as (select 1, ord, regexp_replace(str, '\(', '', 1, ord)
  8             from permute p
  9           union all
 10           select rec.lvl + 1, p.ord, regexp_replace(rec.str, '\(', '', 1, p.ord - rec.lvl)
 11             from rec join permute p on p.ord > rec.ord
 12            where lvl < p.delta),
 13       candidates
 14       as (select distinct str
 15             from rec
 16            where rec.lvl = (select delta from permute where rownum = 1)),
 17       rec_check(iter, str, result)
 18       as (select 1, str, replace(str, '()') result from candidates
 19           union all
 20           select iter + 1, str, replace(result, '()') result
 21             from rec_check
 22            where iter < (select delta from permute where rownum = 1))
 23  select str
 24    from rec_check
 25   where iter = (select delta from permute where rownum = 1)
 26     and result is null;

STR
--------------------------------------------------------------------------------
(()()())()
(()()(()))
(())(())()
((())(()))
((())())()
()()((()))
(())((()))
((()()))()
((()()()))
()()(())()

10 rows selected.

Ну константу можно ж додуматься убрать.
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480544
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopRomanBanandbms_photoshop,

Да этот код вдвое компактнее моего, но для строки с более глубокой вложенностью это не работает например '((()()((())(()'
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
SQL> with t(str) as (select '((()()((())(()' from dual),
  2       permute(ord, str, delta)
  3       as (select level ord, str, length(replace(str, ')')) - length(replace(str, '(')) delta
  4             from t
  5           connect by level <= length(replace(str, ')'))),
  6       rec(lvl, ord, str)
  7       as (select 1, ord, regexp_replace(str, '\(', '', 1, ord)
  8             from permute p
  9           union all
 10           select rec.lvl + 1, p.ord, regexp_replace(rec.str, '\(', '', 1, p.ord - rec.lvl)
 11             from rec join permute p on p.ord > rec.ord
 12            where lvl < p.delta),
 13       candidates
 14       as (select distinct str
 15             from rec
 16            where rec.lvl = (select delta from permute where rownum = 1)),
 17       rec_check(iter, str, result)
 18       as (select 1, str, replace(str, '()') result from candidates
 19           union all
 20           select iter + 1, str, replace(result, '()') result
 21             from rec_check
 22            where iter < (select delta from permute where rownum = 1))
 23  select str
 24    from rec_check
 25   where iter = (select delta from permute where rownum = 1)
 26     and result is null;

Ну константу можно ж додуматься убрать.

Дельта неправильно считается, неучитываются вырожденные случаи:

'))(('
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480557
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kernA
[src oracle]
SQL> with t(str) as (select '((()()((())(()' from dual)


Дельта неправильно считается, неучитываются вырожденные случаи:

'))(('



with t(str) as (select regexp_replace(')(()()((())(((','^\)*','') from dual)

*Убираем незначимые ')' из начала строки
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480584
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kernAДельта неправильно считается, неучитываются вырожденные случаи:

'))(('dbms_photoshopВ лоб: если левых скобок больше чем правых, то убираем число скобок равное разнице (в твоем примере это две скобки) и строим все возможные комбинации. Потом проверяем полученные строки на корректность.Что имено из двух предложений осталось непонятным?

Если число скобок равно - просто генерация вариантов не происходит и на корректность проверяется исходная строка, а не сгенерированные.
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480587
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kernAУбираем
Код: plsql
1.
rtrim(ltrim(..., ')'), '(')
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480595
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopkernAДельта неправильно считается, неучитываются вырожденные случаи:

'))(('dbms_photoshopВ лоб: если левых скобок больше чем правых, то убираем число скобок равное разнице (в твоем примере это две скобки) и строим все возможные комбинации. Потом проверяем полученные строки на корректность.Что имено из двух предложений осталось непонятным?

Если число скобок равно - просто генерация вариантов не происходит и на корректность проверяется исходная строка, а не сгенерированные.

У тебя предполагается, что максимальная длина это кол-во совпадений ')','('

Например, delta = least(length(replace(str, ')')) , length(replace(str, '(')) )

В случае, когда скобки не соответствуют синтаксису(например, ')' стоят вначале, уровень (iter = (select delta from permute where rownum = 1)), должен быть изначально меньше(тк у тебя не будет комбинаций)

Код: plsql
1.
rtrim(ltrim(..., ')'), '(')


Как вариант.
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480609
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kernAУ тебя предполагаетсяТы ничего не понял.

Хотя если просто хочется поговорить - это в ПТ.
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480645
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в пт не очень интересно разговаривать
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480760
krudensoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ozornitca,

так ведь пятничная задача же сама искала.
Конечно, кривовато, но... Вот вам чучело. Ругайте:

clear screen;
WITH t1 AS--исходные данные
(
SELECT '(()(()(()' src
FROM dual
)
, t11 AS
(
SELECT replace(rtrim(replace(
replace(ltrim(replace(src, ')', ' ')), ' ', ')')
, '(', ' ')), ' ', '(') src--и сразу их почистим от левака
FROM t1
)
, t2 AS --разбивка на строки с символом скобки
(
SELECT
SUBSTR(src,LEVEL,1) scb
,ROWNUM RN
FROM t11
CONNECT BY LEVEL <= LENGTH(src)
)
,t3 AS --вычисляем количество левых и правых скобок
(
SELECT
SUM(CASE WHEN scb='(' THEN 1 ELSE 0 END) scbR
,SUM(CASE WHEN scb=')' THEN 1 ELSE 0 END) scbL
FROM t2
)
, t4 AS--находим минимум
(
SELECT
CASE WHEN scbR < scbL THEN scbR ELSE scbL END scbMin
FROM t3
)
,t5 AS --все нужные правые и левые скобки
(
SELECT
'(' scb
,ROWNUM RN
FROM t4
CONNECT BY LEVEL <= t4.scbMin*2
UNION ALL
SELECT
')' scb
,ROWNUM RN
FROM t4
CONNECT BY LEVEL <= t4.scbMin*2
)
, t6 AS --И получаем все варианты скобок! Тут волшебство и магия. Вжух!
(
SELECT
REPLACE(sys_connect_by_path(scb, ' '),' ','') as res
,SUBSTR(sys_connect_by_path(scb, '.*\'),1) as res2
from t5
where connect_by_isleaf = 1
start with rn = 1
connect by rn = prior rn + 1
)
,t7 AS --теперь осталось вычистить ненужные...
(
SELECT
t6.res txt
, t6.res2
, scbMin
, rownum RN
FROM t6, t4
WHERE
LENGTH(replace(t6.res,'(','')) = t4.scbMin--левых скобок нужное кол-во
AND LENGTH(replace(t6.res,')','')) = t4.scbMin --правых скобок нужное кол-во
AND SUBSTR(t6.res, 1,1)='(' --начинается с левой скобки
AND SUBSTR(t6.res, -1,1)=')' --заканчивается правой скобкой
)
,t8 AS --просто счетчик. Без него не получилось
(
SELECT LEVEL RN
FROM t4
CONNECT BY LEVEL <= scbMin*2
)
, t9 AS --плохие скобки, фу
(
SELECT t7.RN
FROM t7, t8
WHERE NVL(LENGTH(REPLACE(SUBSTR(t7.Txt, 1, t8.RN),')','')),0) - NVL(LENGTH(REPLACE(SUBSTR(t7.Txt, 1, t8.RN),'(','')),0) < 0
)
,t10 AS
(
SELECT t7.TXT, t7.SCBMIN, t7.RN, (SELECT src FROM t1) src, t7.res2
FROM t7
WHERE t7.RN NOT IN (SELECT rn FROM t9)
)
SELECT txt, src, res2, REGEXP_REPLACE(src, res2,'*') ss
FROM t10
WHERE REGEXP_LIKE(src, res2) ;
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39480776
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomanBananДля произвольной строки, состоящей из открывающих и закрывающих скобок написать запрос для вывода всех слов максимальной длины, представляющих правильные скобочные записи.Если решать задачу без "всех", то получается достаточно компактно.
Можно переформулировать: убрать из исходного выражения минимальное число скобок так, чтоб оно стало корректным.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SQL> with t(id, str) as
  2   (select 1, '(()(()' from dual union all
  3    select 2, '((()()((())(()' from dual union all
  4    select 3, '((()))))))(()' from dual union all
  5    select 4, ')))()(((' from dual union all
  6    select 5, '(()))))(((())((()())())((' from dual),
  7  rec(lvl, id, str, prev) as
  8   (select 1, id, str, ' '
  9      from t
 10    union all
 11    select lvl + 1, id, regexp_replace(str, '\((#*)\)', '#\1#'), str
 12      from rec
 13     where str <> prev)
 14  select *
 15    from (select id, max(str) keep(dense_rank first order by lvl desc) str_mod from rec group by id)
 16    join t using (id)
 17   cross apply (select listagg(decode(substr(str_mod, rownum, 1), '#',
 18                                      substr(str, rownum, 1))) within group(order by level) as str_fixed
 19                  from dual
 20                connect by rownum <= length(str));

        ID STR_MOD                        STR                            STR_FIXED
---------- ------------------------------ ------------------------------ --------------------
         1 (##(##                         (()(()                         ()()
         2 ((####(####(##                 ((()()((())(()                 ()()(())()
         3 ######))))(##                  ((()))))))(()                  ((()))()
         4 )))##(((                       )))()(((                       ()
         5 ####)))((##############((      (()))))(((())((()())())((      (())(())((()())())

Для общего случая надо делать более хитрый перебор чем было у меня в заготовке, но неохота заморачиваться на SQL.
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39481447
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopТы ничего не понял.

dbms_photoshopДля общего случая надо делать более хитрый перебор чем было у меня в заготовке, но неохота заморачиваться на SQL.

Я тебе об этом и говорю, что сначала нужно определить максимальное кол-во совпадения "правильных" скобок("()"), а затем по этому кол-ву выводить все варианты.
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39481645
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kernA,

А, понял. Ты не из тех, кто пишет решения, ты советчик, оценщик... и провайдер "полезных" ссылок.
...
Рейтинг: 0 / 0
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39481804
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopkernA,

А, понял. Ты не из тех, кто пишет решения, ты советчик, оценщик... и провайдер "полезных" ссылок.

наверное, да.
Сначала спроектирую вариант, а потом делаю.

В данном случае, я не вижу эффективного запроса в sql, который не будет колбасить одни и те же данные по несколько раз и который выведет результат без построения дерева( не доверяю я ему при кол-ве символов от 1000)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Какие есть идеи? Нужна помощь в вариантах решения задачи.
    #39912624
kochhar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А не подскажете, пожалуйста, как такую задачу можно решить при помощи model?
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Какие есть идеи? Нужна помощь в вариантах решения задачи.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]