从 Java 中的给定字母生成所有长度为 N 的单词
Generating all words of length N from a given alphabet in Java
使用给定字母表中的字符生成所有 N 长度单词的最简洁方法,这样它们必须包含给定字符 c。
如果长度为 2,对于具有此字符 {a,b} 且字符为 'b' 的字母表,它应该 return 像这样的列表:
ab , ba , bb
到目前为止,我正在考虑使用嵌套循环,但它并不干净,或者使用与置换类似的方法,通过递增最低有效位并在到达字母表中的最后一个字符时回绕来生成它们。
编辑:
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;
这是我构建的函数,我将字母表设为静态,以便通过代码更轻松地访问,因为我不会更改它。
对其进行了一些改进,使其不再只检查一个字符,而是检查特定的字符数组。
想要对清晰度、复杂性或一些我可能已经看过的东西进行审查。
既然你没有提供任何 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 版本应该更简单... ;)
使用给定字母表中的字符生成所有 N 长度单词的最简洁方法,这样它们必须包含给定字符 c。
如果长度为 2,对于具有此字符 {a,b} 且字符为 'b' 的字母表,它应该 return 像这样的列表:
ab , ba , bb
到目前为止,我正在考虑使用嵌套循环,但它并不干净,或者使用与置换类似的方法,通过递增最低有效位并在到达字母表中的最后一个字符时回绕来生成它们。
编辑:
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;
这是我构建的函数,我将字母表设为静态,以便通过代码更轻松地访问,因为我不会更改它。 对其进行了一些改进,使其不再只检查一个字符,而是检查特定的字符数组。 想要对清晰度、复杂性或一些我可能已经看过的东西进行审查。
既然你没有提供任何 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 版本应该更简单... ;)