句子中所有可能的单词排列

时间:2016-03-23 15:40:09

标签: java

我有一句话,

I love java coding

我需要编写一个函数来返回句子中所有可能的单词排列的数组列表,即

I java love coding
I coding love java
.........

我已经将句子拆分成了一个ArrayList,现在却不知道如何有效地完成任务。 C++有一个函数nextPermutaion(),它提供了开箱即用的解决方案。 java是否提供类似的东西。如果不是,那将是一种有效的方法来完成这项工作。

2 个答案:

答案 0 :(得分:0)

此问题等同于生成一组n个数字的所有可能排列,其中n是句子中的单词数。

将句子转换为ArrayList<String> words个单词,然后生成数组{0,1,...,n-1}的排列,以便每个排列arr代表句子中单词的排列:words[arr[0]], ..., words[arr[n-1]]

至于计算数组的所有排列的问题,在SO上有很多例子。

以下是用于生成列表的所有排列的代码示例(由@YevgenYampolski从this answer获取)。该代码计算List<Integer>的所有排列,并且可以轻松调整以计算List<String>ArrayList<String>实现List<String>)的排列。

public class Permute{
    static void permute(java.util.List<Integer> arr, int k){
        for(int i = k; i < arr.size(); i++){
            java.util.Collections.swap(arr, i, k);
            permute(arr, k+1);
            java.util.Collections.swap(arr, k, i);
        }
        if (k == arr.size() -1){
            System.out.println(java.util.Arrays.toString(arr.toArray()));
        }
    }
    public static void main(String[] args){
        Permute.permute(java.util.Arrays.asList(3,4,6,2,1), 0);
    }
}

答案 1 :(得分:0)

AFAIK java核心集合不提供任何排列函数(就像你在Python集合类中找到的那样)。

Guava(google java libs)提供可迭代排列作为集合2(documented here)的一部分。

如果您不想使用第三方库,则必须使用自己的算法。