问题定义如下: 输入元素,假设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;
答案 0 :(得分:0)
你写道:“元素序列应该保留”。所以,我假设你不是指集合,因为集合没有订单,而是列表和序列之类的东西。
我的建议如下:首先查找长度为2的序列,然后查找长度为3的序列,依此类推。这可以通过以下方式表示长度4。在大“集合”中查找输入m
的索引。然后从以m
结尾的序列开始,作为结果的第一个元素。这是jklm
。将“窗口”向右移动一步,直到找到的序列以m
开头。因此,您获得klmn
,lmno
和mnop
。
这可以通过将当前找到的序列的开头维持为索引来完成。它必须用m
减去4的索引初始化为当前长度加1.然后你必须迭代4次。
答案 1 :(得分:0)
正如其他答案和评论所指出的那样,
您应该期待包含字符串的列表列表。
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); } }
输出是:
[b, c]
[c, d]
[a, b, c]
[c, d, e]
[c, d, e, f]
[c, d, e, f, g]