密码破译
题目描述
我们来做一个简单的密码破译游戏。破译的规则很简单,将数字转换为字母,1转化为a,2转化为b,依此类推,26转化为z。现在输入的密码是一串数字,输出的破译结果是该数字串通过转换规则所能产生的所有字符串。
输入描述:
多行数据,每行为一个数字串。
保证数字串的总长度不超过1000,每行数据的答案至少有1个且不超过1000个。
输出描述:
多行数据,每行对应输出通过数字串破译得到的所有字符串,并按照字符串顺序排列,字符串之间用单个空格分隔。每行开头和结尾不允许有多余的空格。
解题思路
代码
import java.io.*;
import java.util.*;
public class Main {
static StringBuilder res = null;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = "";
while( ( s=br.readLine() )!=null ){
res = new StringBuilder();
solu(s);
}
}
static void solu(String s){
StringBuilder cur = new StringBuilder();
dfs(s, 0, cur);
System.out.println(res.toString().trim());
}
static void dfs(String s,int index,StringBuilder cur){
if(index == s.length()){
res.append(cur + " ");
return;
}
if(s.charAt(index)=='0'){
return;
}else{
cur.append( (char)(s.charAt(index) - '0' - 1 + 'a'));
dfs(s,index+1,cur);
cur.delete(cur.length() - 1,cur.length());
}
//判断是否是最后一个数,如果是,就返回;如果不是,就继续下面两字母换算
if(index+1 >= s.length()) return;
int temp = Integer.parseInt( s.substring(index,index+2) );
if(temp>=10 && temp<=26){
cur.append( (char)(temp - 1 + 'a'));
dfs(s,index+2,cur);
cur.delete(cur.length() - 1,cur.length());
}
}
}