import java.util.*;


public class Solution {

    ArrayList<String> ret;
    StringBuilder path ;
    String[] hash = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    //存储数字与字母的映射关系
    public ArrayList<String> phoneNumber (String num) {
        // write code here
        ret = new ArrayList<>();
        path = new StringBuilder();
        dfs(num,0);
        return ret;
    }

    public void dfs(String num,int pos){
        //递归子函数,pos记录翻译到了能够数字
        if(pos==num.length()){
            //递归到了叶子节点
            ret.add(new String (path));
            return;
        }
        
        
        //得到当前数字对应的字符,递归加入该字符
        String cur = hash[num.charAt(pos)-'0'];
        //遍历每个字母,因为第一次有三种选择
        for(int i=0;i<cur.length();i++){
            //将该字符加入path
            path.append(cur.charAt(i));
            //dfs下一个数字
            dfs(num,pos+1);

            //回溯
            path.deleteCharAt(path.length()-1);
        }

    }
}