如何通过所有可能性增加Java字符串?

2022-09-02 14:19:41

我需要将Java中的字符串从“aaaa”增加到“aaaaaab”到“aaaaaac”,然后通过字母表向上,然后最终增加到“aaaaaaba”到“aaaaaabb”等等。

这有什么诀窍吗?


答案 1

您基本上是在实现一个以 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,具体取决于您的要求),并根据需要将其转换为字符串。这样,您可以轻松增加/减少/修改计数器,而无需解析和重新创建字符串。


答案 2

下面的代码使用递归方法来获取下一个字符串(假设从“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;
 }
}

正如一些人指出的那样,这是尾递归,因此您可以重新制定它,用循环替换递归。