我正在解决spoj的acode问题,这是一个简单的dp问题here
这是我的解决方案:

//http://www.spoj.com/problems/ACODE/

import java.util.Scanner;
//import java.util.Math;
public class Acode {
  public static void main(String[] args)
   {
     Scanner sc = new Scanner(System.in);

     String encodedString = sc.next();
     while (!encodedString.equals("0")) {
       long number = numOfDecodings(encodedString);
       System.out.println(number);
       encodedString = sc.next();
     }

     return;

   }

    public static long numOfDecodings(String encodedString)
    {
         int lengthOfString = encodedString.length();
           long decode[] = new long[lengthOfString];

         decode[0] = 1;

         if (isCurrentTwoDigitsValid(encodedString, 1)) {
             decode[1] = 2;
         } else {
             decode[1] = 1;
         }

         for (int i=2; i<lengthOfString; i++) {
              if (isCurrentTwoDigitsValid(encodedString, i)) {
                   decode[i] = decode[i-2] + decode[i-1];
              } else {
                   decode[i] = decode[i-1];
              }
         }

         return decode[lengthOfString-1];
    }

    public static boolean isCurrentTwoDigitsValid(String encodedString, int startIndex)
    {
        char c1 = encodedString.charAt(startIndex);
        char c2 = encodedString.charAt(startIndex-1);

        if ( (c2=='1') || (c2=='2' && c1<='6')) {
           return true;
        } else {
           return false;
        }

    }


}

但当我试图提交时,我发现了一个NZEC错误,我也测试了它的大值,它没有崩溃,我不知道还有什么可以改进它。

最佳答案

当输入大小1时,会在

if (isCurrentTwoDigitsValid(encodedString, 1)) {
    decode[1] = 2;
} else {
    decode[1] = 1;
}

因为访问超出decode数组边界。
您将0视为有效数字,但它不是例如,输入"10"的正确答案是1,而不是2

10-08 06:40