首页 > 专题系列 > Java解POJ > POJ 2033 Alphacode [解题报告] Java
2013
11-10

POJ 2033 Alphacode [解题报告] Java

Alphacode

问题描述 :

Alice and Bob need to send secret messages to each other and are discussing ways to encode their messages:

Alice: “Let’s just use a very simple code: We’ll assign ‘A’ the code word 1, ‘B’ will be 2, and so on down to ‘Z’ being assigned 26.”

Bob: “That’s a stupid code, Alice. Suppose I send you the word ‘BEAN’ encoded as 25114. You could decode that in many different ways!”

Alice: “Sure you could, but what words would you get? Other than ‘BEAN’, you’d get ‘BEAAD’, ‘YAAD’, ‘YAN’, ‘YKD’ and ‘BEKD’. I think you would be able to figure out the correct decoding. And why would you send me the word ‘BEAN’ anyway?”

Bob: “OK, maybe that’s a bad example, but I bet you that if you got a string of length 500 there would be tons of different decodings and with that many you would find at least two different ones that would make sense.”

Alice: “How many different decodings?”

Bob: “Jillions!”

For some reason, Alice is still unconvinced by Bob’s argument, so she requires a program that will determine how many decodings there can be for a given string using her code.

输入:

Input will consist of multiple input sets. Each set will consist of a single line of digits representing a valid encryption (for example, no line will begin with a 0). There will be no spaces between the digits. An input line of ’0′ will terminate the input and should not be processed

输出:

For each input set, output the number of possible decodings for the input string. All answers will be within the range of a long variable.

样例输入:

25114
1111111111
3333333333
0

样例输出:

6
89
1

解题代码:

//* @author: [email protected]
import java.io.*;
public class Main
{
 public static void main(String[] args) throws IOException
 {
  InputStreamReader is=new InputStreamReader(System.in);
  BufferedReader in=new BufferedReader(is);
  while(true)
  {
   String s=in.readLine();
   if(s.equals("0")) break;
   int l=s.length();
   int[] arr=new int[l];
   int count=0;
   for(int i=0;i< l-1;i++)
   {
    if(s.charAt(i+1)!='0')
	arr[count++]=s.charAt(i)-'0';
    else {
        arr[count++]=(s.charAt(i)-'0')*10;
	i++;
     }
    }
   if(s.charAt(l-1)!='0') arr[count++]=s.charAt(l-1)-'0';
   int[] arr2=new int[count+1];
   arr2[count-1]=arr2[count]=1;
   for(int i=count-2;i>=0;i--)
    {
	if((arr[i]*10+arr[i+1]>26)||arr[i+1]>9) arr2[i]=arr2[i+1];
	else{
		arr2[i]=arr2[i+1]+arr2[i+2];
	}
     }
   System.out.println(arr2[0]);
  }
 }
}

  1. simple, however efficient. A lot of instances it is difficult to get that a??perfect balancea?? among usability and appearance. I must say that youa??ve done a exceptional task with this. Also, the blog masses quite fast for me on Web explore.

  2. 我没看懂题目
    2
    5 6 -1 5 4 -7
    7 0 6 -1 1 -6 7 -5
    我觉得第一个应该是5 6 -1 5 4 输出是19 5 4
    第二个是7 0 6 -1 1 -6 7输出是14 7 7
    不知道题目例子是怎么得出来的