我想创建不同字长的单词表。我的src for ...
长度= 1:
for(int a=97;a<=122;a++)
String foo=String.valueOf((char)a);
长度= 2:
for(int a=97;a<=122;a++)
for(int b=97;b<=122;b++)
String foo=String.valueOf((char)a+""+(char)b);
如何改进此代码以使其与实际字符串长度无关?
答案 0 :(得分:3)
如果您的字符串是一个数字,您只需添加一个字符就可以获得所有可能的值,直到数字溢出为止。
您可以对字符串使用相同的方法;只考虑每个字符一个数字;添加一个最右边的字符;如果它包装,增加下一个字符等。
// for strings of size N
char *str = malloc(N+1);
// init
str[N] = 0;
for (i=0, i<N, i++) str[i]='a';
int done = 0;
while (!done)
{
for(i=N-1; i>=0; i--)
{
str[i] += 1;
if (str[i] == 'z'+1)
{
if (N==0) done = 1;
str[i] = 'a';
}
else break;
}
// do something with str
}
答案 1 :(得分:2)
请注意,以下方法效率很低。通过使用使用字符串构建器的辅助方法可以提高效率,然后在完成后在主方法中完成字符串。
无论如何,递归是处理此问题的最佳方法。
List<String> generate(int len) {
if(len == 1) {
List<String> strings = new LinkedList<String>();
// notice I'm putting a char here, not an int
for(char a=97;a<=122;a++) strings.add(String.valueOf(a));
return strings;
}
List<String> shortStrings = generate(len - 1);
List<String> strings = new LinkedList<String>();
for(String shortString : shortStrings)
for(char a=97;a<=122;a++) strings.add(shortString + A);
return strings;
}
答案 2 :(得分:0)
正如Tejs建议的那样,你会想要使用递归。你不能写循环来获得动态深度,但你可以递归到你想要的任何级别(至少在你的堆栈空间用完之前):
//Pseudocode!
void generate(dictionary, string, depth)
{
if(depth == 0)
{
dictionary.add(string);
}
else
{
for(char c = 'a'; c <= 'z'; ++c)
{
generate(dictionary, string + c, depth - 1);
}
}
}
如果关闭就开始:
dictionary = new Dictionary;
generate(dictionary, '', depth);
然后你就走了。如果你想要将所有字符串包含到所需的长度,这是一个简单的调整 - 只需将字符串添加到字典中,但只有在当前深度大于零时才递归。
希望这有帮助!
答案 3 :(得分:0)
如果我没有完全错,那么你要做的就是生成所有可能的长度为<=N
的字符串。
最简单的方法是将其映射到生成数字的方式,即将数字加1以获得下一个数字。所以基本上从"a"
开始,然后在其中添加1以获取"b"
,依此类推,直至"z"
。现在向此处添加1将导致结转,因此生成"aa"
然后生成"ba"
,直到"za"
为止"ab"
。
如果您可以将自然数映射到字符串,则可以极大地简化此操作。要获取字符串,请执行以下操作:
string getString(int val) {
string str = "";
while (val>=0) {
int rem = val%26; // as there are 26 characters in english
str = str + charToString('a'+rem);
val /= 26;
}
return str;
}
现在只需调用此函数来获取字符串:
void listStrings(int N) {
int max = 26^N-1;
string str;
for(int i=1; i<=max; ++i) {
str = getString(i);
doSomething(str); // maybe print it or store in file
}
}
我希望这会对你有所帮助。