从1到26分别对应a-z的每一个字母,输入一串数字的字符串,转换为字母,输出所有可能的字母序列。如123->abc、lc、aw

从1到26分别对应a-z的每一个字母,输入一串数字的字符串,转换为字母,输出所有可能的字母序列。如123->abc、lc、aw,本资源是按照二叉树的思想解决该问题。从字符串的头部开始,每次可以取一个或者两个数字进行转换,向左为取一个,向右取两个.
Item类:

public class Item {
	//指向父节点
	private Item parent;
	
	//该节点

的字符串的值
	private String key;
	//转义后的值
	private String code;
	//这个节点在字符串中的位置
	//如1在123中index=0,12在123中index=1
	private int index;
	
	public int getIndex() {
		return index;
	}
	public void setIndex(int index) {
		this.index = index;
	}
	public Item getParent() {
		return parent;
	}
	public void setParent(Item parent) {
		this.parent = parent;
	}
	public String getKey() {
		System.out.println(key);
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
	public String getCode() {
		if(index == -1 || !Main.map.containsKey(key)){
			return "";
		}
		return Main.map.get(key);
	}
	public void setCode(String code) {
		this.code = code;
	}
	

}

Main函数:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class Main {

	public static List list = new ArrayList<>();
	public static Map map = new HashMap<>();
	/**  
	 * @Title: main  
	 * @Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param @param args    参数  
	 * @return void    返回类型  
	 * @throws  
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String input = "123454321";
		char arr[] = input.toCharArray();
		initMap();
		//首先去创建这个二叉树
		//1.定义一个根节点
		Item root = new Item();
		root.setIndex(-1);
		createChileItem(root, arr);
		//看这个二叉树,从根结点到每一个叶子节点的经过的值,其实就是每一个解
		System.out.println(input);
		for(Item item: list){
			String path = getPath(item);
			//因为是从叶子节点向上找,所以要取一下反
			path = new StringBuilder(path).reverse().toString(); 
			System.out.println(path);
		}
	}
	
	public static String getPath(Item item){
		if(item.getParent() != null){
			return item.getCode() + getPath(item.getParent());
		}else{
			return item.getCode();
		}
	}
	
	/**
	 * 
	    * @Title: createChileItem  
	    * @Description: 为每一个节点创建左右子节点 
	    * @param @param item
	    * @param @param arr    参数  
	    * @return void    返回类型  
	    * @throws
	 */
	public static void createChileItem(Item item, char[] arr){
		//表示这个节点已经是最后一个了,判断为叶子节点
		if(item.getIndex() == arr.length - 1){
			//把叶子节点放进list里头去
			list.add(item);
		}else{//表示这个节点不是最后一个
			char next1 = arr[item.getIndex() + 1];
			if(item.getIndex() + 2 < arr.length){
				char next2 = arr[item.getIndex() + 2];
				String key = String.valueOf(next1) + String.valueOf(next2);
				if(key.equals("00")){
					item.setIndex(item.getIndex() + 2);
					createChileItem(item, arr);
					return;
				}
			}
			
			//先创建左子节点(走一步)
			
			Item leftItem = new Item();
			leftItem.setIndex(item.getIndex() + 1);
			leftItem.setParent(item);
			leftItem.setKey(String.valueOf(next1));
			//左子节点继续创建子节点
			createChileItem(leftItem, arr);
			//然后创建右子节点,需要判断一下,走两步获得的值满足<=26
			//保证走两步是可以的
			if(item.getIndex() + 2 < arr.length){
				char next2 = arr[item.getIndex() + 2];
				String key = String.valueOf(next1) + String.valueOf(next2);
				if(0 < Integer.parseInt(key) && Integer.parseInt(key) <= 26){
					Item rightItem = new Item();
					rightItem.setIndex(item.getIndex() + 2);
					rightItem.setParent(item);
					rightItem.setKey(Integer.parseInt(key) + "");
					//然后给右子节点继续创建子节点
					createChileItem(rightItem, arr);
				}
			}
		}
	}
	
	
	/**
	 * 初始化密码对应map
	 */
	public static void initMap(){
		String t = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
		String arr[] = t.split(",");
		for(int i = 0; i < 26; i++){
			map.put("" + (i + 1), arr[i]);
		}
	}

}

运行结果如下所示:
从1到26分别对应a-z的每一个字母,输入一串数字的字符串,转换为字母,输出所有可能的字母序列。如123->abc、lc、aw_第1张图片

你可能感兴趣的:(编程)