从Java中的给定字母表生成长度为N的所有单词

时间:2017-05-24 00:55:44

标签: java string permutation combinatorics

生成所有N长度单词的最简洁方法,使用给定字母表中的字符,这样他们必须在其中包含给定字符c。

如果长度为2,则对于具有此字符{a,b}的字母,该字符为' b'它应该返回一个这样的列表:

  

ab,ba,bb

到目前为止,我正在考虑使用嵌套循环,但它不干净,或者使用类似的排列方法,通过增加最低有效位并在从字母表到达最后一个字符时回绕来生成它们。 / p>

修改

    ArrayList <String> data = new ArrayList <String>();
    int iterations = (int) Math.pow(alfabet.length, N);

    int  pos [] = new int [N];
    pos[N-1] = -1;
    for (int i = 0 ; i < iterations;i++)
    {
        pos[N-1]++;
        for (int j = N-1; j >= 0;j--)
        {
            if (pos[j] == alfabet.length) 
            {
                pos[j] = 0;
                pos[j-1] ++;
            }
            else break;
        }
        String word = "";
        for (int j = 0 ; j < N; j++ )
        {
            word += alfabet[pos[j]];
        }
        int val = 0;
        for (int j = 0 ; j < lst.length; j++)
        {
            if (word.contains(lst[j] + "")) val++;
        }
        if (val == lst.length) data.add(word);

    }
    return data;

这是我构建的功能,我使字母表保持静态,以便通过代码更容易访问,因为我不会改变它。 对它进行了改进,并使其不仅仅检查一个字符,而是检查某个字符数组。 想要审查清晰度,复杂性或我可能已经查看的一些事情。

1 个答案:

答案 0 :(得分:4)

由于你没有提供任何 Java代码,我也不会;)我不想破坏你的乐趣......

伪代码(又名Swift)中的一个简短,快速,非递归的解决方案,可以帮助您:

let alphabet = ["a", "b", "c"]
let requiredChar = 2
func printAllWords() {
    var word = [0, 0]
    for _ in 0 ..< pow(alphabet.count, word.count) {
        if word.contains(requiredChar) { print(word) }
        for char in 0 ..< word.count {
            word[char] = (word[char] + 1) % alphabet.count
            if word[char] != 0 { break } // overflow
        }
    }
}

输出所需的单词:

  

CA
  CB
  AC
  BC
  cc

这应该以 O(n.zⁿ)时间复杂度运行,其中:

  • n 长度;
  • z 字母长度。

要使用此代码try this Swift sandbox

从中获取可用的Java版本应该很简单。 Kotlin版本应该更容易......;)