2017-05-11 23 views
-2

例如'A B C'是我的句子,我想更改所有變體中的單詞位置。如..如何更改句子中所有變體中的單詞位置

'A B C' 
'A C B' 
'B C A' 
'B A C' 
'C A B' 
'C B A' 

感謝ü

+0

所以'A B C'' 'B A C''應該用'取代'? –

+0

你嘗試過什麼嗎? SO不適用於「如何做到這一點」等問題。請嘗試一下,然後,如果您的代碼存在問題,請在此處發帖提問。 – Aleksej

+0

這可以做到,但是你是否意識到如果你的輸入句子有很多單詞,你會很快得到非常非常多的行數?如果輸入有100個單詞,你知道有多大100!是什麼? (100階乘) – mathguy

回答

0

有兩個部分的問題。

第一部分是將輸入的句子拆分爲單詞。這是一個單獨的問題,堆棧溢出(超過100個)有很多線程顯示瞭如何完成,我假設你的問題更多地是關於排列。

第二部分是,一旦你有了單詞,你如何得到所有的排列組合。一種方法是使用分層查詢,如原始帖子下的評論中所討論的;然而,舊的解決方案似乎過於複雜。這裏是你可以用一個分層查詢做最簡單的方法:

with 
    test_data (str) as (
     select 'alpha' from dual union all 
     select 'beta' from dual union all 
     select 'gamma' from dual 
    ) 
-- end of test data 
select  trim(sys_connect_by_path(str, ' ')) as perm 
from  test_data 
where  connect_by_isleaf = 1 
connect by nocycle prior str is not null 
; 

PERM 
---------------- 
alpha beta gamma 
alpha gamma beta 
beta alpha gamma 
beta gamma alpha 
gamma alpha beta 
gamma beta alpha 

我們具備的條件PRIOR STR IS NOT NULL的唯一原因就是如此,我們在其中STR出現與PRIOR操作的條件。受制於CONNECT BY中的PRIOR運算符的列是在分層查詢中定義「週期」的列。 NOCYCLE指令意味着我們不應該在輸出中重複使用STR的值 - 這正是我們想要的。由於我真的不需要STR的任何條件,我只是想與PRIOR運營商合作,我寫了一個微不足道的條件,PRIOR STR IS NOT NULL。所有的工作都是通過分層查詢完成的,其中NOCYCLE,當然還有SYS_CONNECT_BY_PATH。需要TRIM是因爲沒有它,輸出以空格開始(SYS_CONNECT_BY_PATH的結果)。 WHERE條款使用CONNECT_BY_ISLEAF是必要的,因爲我們只需要全排列,我們也不需要單個詞,以及雙詞子集的排列。 (剛離開WHERE條款出來一看就知道做什麼。)

0

感謝ü@mathguy ..

WITH WORDS AS 
(SELECT REGEXP_SUBSTR(P_TEXT1, '\S+', 1, LEVEL) AS WORD, LEVEL AS NUM 
    FROM DUAL 
    CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(P_TEXT1, '\S+\s*', 'X'))) 
SELECT TRIM(SYS_CONNECT_BY_PATH(W.WORD, ' ')) AS PERM 
    FROM WORDS W 
WHERE CONNECT_BY_ISLEAF = 1 
CONNECT BY NOCYCLE PRIOR W.WORD IS NOT NULL 
相關問題