|
第19题的第一个递归是不必要的:
VAR N NUMBER;
EXEC :N:=4;
WITH p AS (
SELECT REPLACE(SYS_CONNECT_BY_PATH(n,','),',') p,POWER(2,ROWNUM-1) id
FROM (SELECT LEVEL n FROM DUAL CONNECT BY LEVEL<=:N)
WHERE LEVEL=:N
CONNECT BY NOCYCLE n<>PRIOR n
)
,l AS (
SELECT p1.p||SUBSTR(p1.p,1,:N-1) s,SUM(p2.id) all_id
FROM p p1,p p2
WHERE INSTR(p1.p||SUBSTR(p1.p,1,:N-1),p2.p)>0
GROUP BY p1.p
)
,q(s,all_id) AS (
SELECT s,all_id
FROM l
UNION ALL
SELECT CASE WHEN SUBSTR(q.s,-2)=SUBSTR(l.s,1,2) THEN q.s||SUBSTR(l.s,3)
ELSE q.s||SUBSTR(l.s,2)
END
,q.all_id+l.all_id
FROM l,q
WHERE (SUBSTR(q.s,-2)=SUBSTR(l.s,1,2) OR SUBSTR(q.s,-1)=SUBSTR(l.s,1,1))
AND BITAND(q.all_id,l.all_id)=0
)
SELECT MIN(s) KEEP(DENSE_RANK FIRST ORDER BY LENGTH(s)) s FROM q WHERE all_id=(SELECT SUM(id) FROM p);
123412314231243121342132413214321
|
|