2016-08-23 17 views
1

問題定義如下: 輸入單元,假定米尋找從一個大的集合中的所有順序的子集與特定元件

大集合,假設{A,B,C,d,..z}

我想找到包含輸入單詞m的2-5個元素的所有長度的子集。 條件:元素的順序應保持相同。

輸出:

  • {L,M},{M,N},

  • {K,L,M},{1,M,N},{M,N ,o},

  • {j,k,l,m},{k,l,m,n},{l,m,n,o},{m,n,o,p} .. 。等等

我能夠得到從輸入開始的子集字由下面的代碼:

ArrayList<String> phrases = new ArrayList<>(); 

    for (int j=1; j<=k-i; j++) { 
     String newSet = set[i] +" "; 
     for (int x=1; x<=j; x++) { 
      newSet=newSet+set[i+x]+" "; 
     } 
     phrases.add(newSet.trim()); 
    } 
    return phrases; 
} 
+0

哪裏ķUND我是從哪裏來的? – mm759

+0

長度= 2..5 {對於位置=最大(0,序列中字母的位置 - (長度-1)...序列中字母的位置{追加長度長度從位置位置開始的子序列,如果存在}} < <<應該不言自明 – Aziuth

回答

0

正如所指出對方的回答,也是評論,

  1. 首先得到輸入字
  2. 把你的一套子列表既左右從輸入字增加一個索引直到達到它們各自的目標(列表的第一個和最後一個元素),或者直到達到最大長度5爲止。
  3. 您應該期望列出包含字符串的列表。

    private static List<List<String>> getSubSet(List<String> set, String word){ 
        List<List<String>> phrases = new ArrayList<>(); 
        int indexOfWord = set.indexOf(word); 
        int len = 1; 
        while(indexOfWord-len>=0 || indexOfWord+len<=set.size()){ 
         if (indexOfWord-len>=0) 
          phrases.add(set.subList(indexOfWord-len, indexOfWord+1)); 
         if (indexOfWord+len<set.size()) 
          phrases.add(set.subList(indexOfWord, indexOfWord+len+1)); 
         len++; 
         if(len>4) break; 
        } 
        return phrases; 
    } 
    

    要看到一個樣品的測試情況下,我已經採取單一元素的字符串,就像你:

    公共靜態無效的主要(字串[] args){ 名單列表= Arrays.asList(「一」, 「b」, 「C」, 「d」, 「E」, 「F」, 「G」, 「H」, 「I」, 「J」); String inWord =「c」; List> phrases = getSubSet(list,inWord); (列表p:短語) { System.out。的println(P); }}

輸出是:

[b, c] 
[c, d] 
[a, b, c] 
[c, d, e] 
[c, d, e, f] 
[c, d, e, f, g] 
+0

抱歉沒有正確格式化代碼的最後部分,我努力嘗試,但是我不能。 – Addis

0

你寫:「元素的順序應該保持」。所以,我假設你不是指集合,因爲集合沒有訂單,而是像列表和序列。

我的建議如下:先找到長度爲2的序列,然後是長度爲3的序列,依此類推。這可以做到,讓我們假設長度4以下方式。在大集合中找到輸入m的索引。然後以m作爲結果的第一個元素結束的序列開始。這是jklm。向右移動「窗口」,直到找到的序列以m開頭。所以,你得到klmn,lmnomnop

這可以通過將當前找到的序列的開頭保持爲索引來完成。它必須使用索引m減去4作爲當前長度加1進行初始化。然後,您必須迭代4次。

相關問題