|
递归暴力法:
WITH p AS (
SELECT pos,l
FROM (SELECT ROWNUM pos FROM DUAL CONNECT BY ROWNUM<=10),(SELECT ROWNUM l FROM DUAL CONNECT BY ROWNUM<=3)
)
,t (str,len,path) AS (
SELECT REPLACE(SYS_CONNECT_BY_PATH(n,','),',') ,LEVEL,REPLACE(SYS_CONNECT_BY_PATH(n,','),',')
FROM (SELECT ROWNUM-1 n FROM DUAL CONNECT BY ROWNUM<=10)
START WITH n>0
CONNECT BY NOCYCLE LEVEL<=3
UNION ALL
SELECT SUBSTR(str,1,p.pos-1)||TO_CHAR(SUBSTR(str,p.pos,p.l)*SUBSTR(str,p.pos,p.l))||SUBSTR(str,p.pos+p.l)
,LENGTH(SUBSTR(str,1,p.pos-1)||TO_CHAR(SUBSTR(str,p.pos,p.l)*SUBSTR(str,p.pos,p.l))||SUBSTR(str,p.pos+p.l))
,path||','||SUBSTR(str,1,p.pos-1)||TO_CHAR(SUBSTR(str,p.pos,p.l)*SUBSTR(str,p.pos,p.l))||SUBSTR(str,p.pos+p.l)
FROM t,p
WHERE p.pos+p.l-1<=t.len
AND LENGTH(TRANSLATE('1234567890','$'||SUBSTR(str,1,p.pos-1)||TO_CHAR(SUBSTR(str,p.pos,p.l)*SUBSTR(str,p.pos,p.l))||SUBSTR(str,p.pos+p.l),'$'))
= 10 - LENGTH(SUBSTR(str,1,p.pos-1)||TO_CHAR(SUBSTR(str,p.pos,p.l)*SUBSTR(str,p.pos,p.l))||SUBSTR(str,p.pos+p.l))
)
CYCLE str SET cycle_flag TO 'Y' DEFAULT 'N'
SELECT path FROM (
SELECT * FROM t ORDER BY len DESC,str DESC
)
WHERE ROWNUM=1;
PATH
--------------------------------------------------------------
387,3849,382401,982401,9857601,98257601,98457601,984573601 |
|