【问题标题】:finding all sequential subsets from a large set with a particular element从具有特定元素的大集合中查找所有顺序子集
【发布时间】:2016-08-23 13:13:01
【问题描述】:

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

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

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

输出:

  • {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}...等等开

我能够通过以下代码获得从输入单词开始的子集:

    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;
}

【问题讨论】:

  • k und i 来自哪里?
  • for length = 2..5 { for position = max(0, 字母在序列中的位置 - (length -1) ... 字母在序列中的位置 { 附加长度长度的子序列从position 如果存在 } }

标签: java string algorithm loops for-loop


【解决方案1】:

正如其他答案和 cmets 所指出的,

  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;
    }
    

    为了查看一个示例测试用例,我像你一样采用了单个元素的字符串:

    public static void main(String[] args) { 列表列表= Arrays.asList("a","b","c","d","e","f","g","h","i","j"); 字符串 inWord = "c"; 列表> 短语 = getSubSet(list,inWord); for(列表 p:短语){ System.out.println(p); } }

输出是:

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

【讨论】:

  • 很抱歉没有正确格式化代码的最后一部分,我努力了,但还是不行。
【解决方案2】:

您写道:“元素的序列应该保留”。因此,我假设您不是指集合,因为集合没有顺序,而是类似于列表和序列之类的东西。

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

这可以通过将当前找到的序列的开头保持为索引来完成。它必须以m 的索引-4 作为当前长度加1 进行初始化。然后您必须迭代4 次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 2012-10-31
    相关资源
    最近更新 更多