如何在java中创建一个"单词生成器" - 它为我提供了ascii表范围内所有可能的字符组合,并且具有一定的长度或更短.
到目前为止我所做的是一个绝对的混乱,而不是一个很好的解决方案.它可以生成一系列字符中的单词(在本例中为48到57),但它的固定字长为4.
for (int i = 48; i < 58; i++) {
for (int j = 48; j < 58; j++) {
for (int k = 48; k < 58; k++) {
for (int l = 48; l < 58; l++) {
String bruteword = "" + (char) i + (char) j + (char) k + (char) l;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望你们明白我的意思.对不起,我总是很难用英语表达这些东西.
递归可以帮到这里.假设你说,words(min, max, n)给你的所有的单词的列表n长与之间的字符min和max.你可以通过说if n = 0,唯一的单词是空字符串来实现它; 否则,你可以通过附加每个可能的字符来获得所有单词words(min, max, n - 1).
List<String> words(char min, char max, int n) {
List<String> ret = new ArrayList<String>();
if(n == 0) {
ret.add("");
return ret;
}
for(String word : words(min, max, n - 1)) {
for(char c = min; c <= max; ++c) {
ret.add(word + c);
}
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
迭代解决方案也会产生小于请求长度的所有可能性:
List<String> words(char min, char max, int n) {
List<String> ret = new ArrayList<String>();
ret.add("");
int start = 0;
for(int length = 1; length <= n; ++length) {
int end = ret.size();
for(int i = 0; i < end; ++i) {
for(char c = min; c <= max; ++c) {
ret.add(ret.get(i) + c);
}
}
start = end;
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
如果你不想保存单词,你肯定需要递归,因为你基本上使用堆栈代替列表:
void words(char min, char max, int n) {
for(int i = 0; i <= n; ++i) {
wordsRecursive("", min, max, i);
}
}
void wordsRecursive(String base, char min, char max, int n) {
if(n == 0) {
System.out.println(base);
} else {
for(char c = min; c <= max; ++c) {
wordsRecursive(base + c, min, max, n - 1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2972 次 |
| 最近记录: |