从具有特定元素的大集合中查找所有顺序子集

时间:2016-08-23 13:13:02

标签: java string algorithm loops for-loop

问题定义如下: 输入元素,假设m

大集合,假设{a,b,c,d,.. z}

我想找到长度为2-5个元素的所有子集,包含输入字m。 条件:元素序列应保持不变。

输出:

  • {l,m},{m,n},

  • {k,l,m},{l,m,n},{m,n,o},

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

我能够通过以下代码从输入字开始获取子集:

var
  ii: integer
begin
  for ii := 0 to memo.lines.count -1 do begin
    if pos('Gateway:   10.127.', memo.lines[ii]) > 0 then begin
      textbox.caption := memo.lines[ii];
      break; 
    end;
  end;
end;

2 个答案:

答案 0 :(得分:0)

你写道:“元素序列应该保留”。所以,我假设你不是指集合,因为集合没有订单,而是列表和序列之类的东西。

我的建议如下:首先查找长度为2的序列,然后查找长度为3的序列,依此类推。这可以通过以下方式表示长度4。在大“集合”中查找输入m的索引。然后从以m结尾的序列开始,作为结果的第一个元素。这是jklm。将“窗口”向右移动一步,直到找到的序列以m开头。因此,您获得klmnlmnomnop

这可以通过将当前找到的序列的开头维持为索引来完成。它必须用m减去4的索引初始化为当前长度加1.然后你必须迭代4次。

答案 1 :(得分:0)

正如其他答案和评论所指出的那样,

  1. 首先获取输入词的索引
  2. 将输入字的左右两个子列表递增一步,直到达到各自的结尾(列表的第一个和最后一个元素)或直到达到最大长度为5。 / LI>
  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;
    }
    

    要查看示例测试用例,我已经采用了与您类似的单个元素串:

    public static void main(String [] args){     列表列表= Arrays.asList(“a”,“b”,“c”,“d”,“e”,“f”,“g”,“h”,“i”,“j”);     字符串inWord =“c”;     列表&gt; phrase = getSubSet(list,inWord);     for(List p:phrase){         的System.out.println(P);     } }

  4. 输出是:

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