如何通过所有可能性增加Java字符串?
我需要将Java中的字符串从“aaaa”增加到“aaaaaab”到“aaaaaac”,然后通过字母表向上,然后最终增加到“aaaaaaba”到“aaaaaabb”等等。
这有什么诀窍吗?
我需要将Java中的字符串从“aaaa”增加到“aaaaaab”到“aaaaaac”,然后通过字母表向上,然后最终增加到“aaaaaaba”到“aaaaaabb”等等。
这有什么诀窍吗?
您基本上是在实现一个以 26 为基数的编号系统,该系统带有前导“零”(“a”)。
这样做的方式与将 int 转换为 base-2 或 base-10 String 的方式相同,但不是使用 2 或 10,而是使用 26,而不是 “0” 作为基础,而是使用 “a”。
在Java中,您可以轻松地使用它:
public static String base26(int num) {
if (num < 0) {
throw new IllegalArgumentException("Only positive numbers are supported");
}
StringBuilder s = new StringBuilder("aaaaaaa");
for (int pos = 6; pos >= 0 && num > 0 ; pos--) {
char digit = (char) ('a' + num % 26);
s.setCharAt(pos, digit);
num = num / 26;
}
return s.toString();
}
那么基本的想法是不要存储字符串,而只是存储一些计数器(int int或long,具体取决于您的要求),并根据需要将其转换为字符串。这样,您可以轻松增加/减少/修改计数器,而无需解析和重新创建字符串。
下面的代码使用递归方法来获取下一个字符串(假设从“aaaa”到“aaab”等),而无需生成所有以前的组合,因此它相当快,并且不限于给定的最大字符串长度。
public class StringInc {
public static void main(String[] args) {
System.out.println(next("aaa")); // Prints aab
System.out.println(next("abcdzz")); // Prints abceaa
System.out.println(next("zzz")); // Prints aaaa
}
public static String next(String s) {
int length = s.length();
char c = s.charAt(length - 1);
if(c == 'z')
return length > 1 ? next(s.substring(0, length - 1)) + 'a' : "aa";
return s.substring(0, length - 1) + ++c;
}
}
正如一些人指出的那样,这是尾递归,因此您可以重新制定它,用循环替换递归。