递归列表助记符

时间:2016-11-28 03:14:39

标签: java recursion

我正在研究一个传递3位字符串的项目,它应该返回所有可能的助记符组合的ArrayList。例如,如果我传入数字" 623",它应该返回一个列表 [MAD MBD MCD NAD NBD NCD OAD OBD OCD MAE MBE MCE NAE NBE NCE OAE OBE OCE MAF MBF MCF NAF NBF NCF OAF OBF OCF]。

然而,我一直得到[MAD,MADE,MADEF,MABD,MABDE,MABDEF,MABCD,MABCDE,MABCDEF,MNAD,MNADE,MNADEF,MNABD,MNABDE,MNABDEF,MNABCD,MNABCDE,MNABCDEF,MNOAD的结果, MNOADE,MNOADEF,MNOABD,MNOABDE,MNOABDEF,MNOABCD,MNOABCDE,MNOABCDEF]。我似乎无法弄清楚我在这里做错了什么..它本应该返回长度为3的字符串,它似乎只能修改前面的字母。

这是我的代码:

public class PhoneMnemonics {
   public static void main(String[] args) {
      ArrayList<String> test = listMnemonics("623");
      System.out.print(test);
   }

   public static ArrayList<String> listMnemonics(String number) {
      ArrayList<String> result = new ArrayList<String>();
      recursiveMnemonics(result, "", number);
      return result;
   }

   private static void recursiveMnemonics(ArrayList<String> result, String mnemonicSoFar, String digitsLeft) {
      if (digitsLeft.length() == 0) {
         // Add current mnemonic
         result.add(mnemonicSoFar);
      } else {
         // Try all combinations for single digit
         int numLetters = digitLetters(digitsLeft.charAt(0)).length();
         String letters = digitLetters(digitsLeft.charAt(0));
         if (digitsLeft.length() > 1 ) {
               digitsLeft = digitsLeft.substring(1);
         } else {
               digitsLeft = "";
         }
         for (int i = 0; i < numLetters; i++) {
            char c = letters.charAt(i);
            mnemonicSoFar = mnemonicSoFar + Character.toString(c);
            recursiveMnemonics(result, mnemonicSoFar, digitsLeft);
         }
      }
   }

   public static String digitLetters(char ch) {
      String result = "";
      switch (ch) {
         case '2': result = "ABC";
                  break;
         case '3': result = "DEF";
                  break;
         case '4': result = "GHI";
              break;
         case '5': result = "JKL";
                  break;         
         case '6': result = "MNO";
                  break;         
         case '7': result = "PQRS";
                  break;
         case '8': result = "TUV";
                  break;         
         case '9': result = "WXYZ";
                  break;         
      }
      return result;
   }
}

非常感谢任何帮助!

编辑:我移动了if语句,它在代码中编辑了digitsLeft字符串,并且稍微修改了我的结果。

1 个答案:

答案 0 :(得分:0)

主要问题是在将mnemonicSoFar添加到结果后应该修复它。 例如:

您到达MAD并将其添加到结果中。之后,您需要使用mnemonicSoFar = MA和要添加的字母E进行同样的操作。请注意,您将mnemonicSoFar的最后一个字母取出。 所以你应该纠正你的代码:

for (int i = 0; i < numLetters; i++) {
                char c = letters.charAt(i);
                mnemonicSoFar = mnemonicSoFar + Character.toString(c);
                recursiveMnemonics2(result, mnemonicSoFar, digitsLeft);
                mnemonicSoFar = mnemonicSoFar.substring(0,mnemonicSoFar.length()-1); 
}

如果您想改进编码风格,我会稍微重构您的代码。

private static void recursiveMnemonics(ArrayList<String> result, String mnemonicSoFar, String digitsLeft) {
   if(digitsLeft.length() == 0) {
       result.add(mnemonicSoFar);
       return;
   }
   String letters = digitLetters(digitsLeft.charAt(0));
   digitsLeft = digitsLeft.substring(1);
   for(int i = 0; i < letters.length(); i++) {
      mnemonicSoFar = mnemonicSoFar + letters.charAt(i);
      recursiveMnemonics(result, mnemonicSoFar, digitsLeft);
      mnemonicSoFar = mnemonicSoFar.substring(0,mnemonicSoFar.length()-1);
   }
}

在我看来,它更具可读性。