|
第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
)
,t(s,all_id) AS ( -----第一次递归找出三位重叠的,每组只有四个,之后就循环了
SELECT CAST(p AS VARCHAR2(100)),id FROM p
UNION ALL
SELECT t.s||SUBSTR(p.p,-1),t.all_id+p.id
FROM t,p
WHERE SUBSTR(t.s,1-:N)=SUBSTR(p.p,1,:N-1)
AND INSTR(t.s,p.p)=0
)
,l AS (
SELECT *
FROM t
WHERE NOT EXISTS
(SELECT NULL
FROM p
WHERE SUBSTR(t.s,1-:N)=SUBSTR(p.p,1,:N-1)
AND INSTR(t.s,p.p)=0
) --- 相关子查询找出叶子
)
,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
|
|