其他分享
首页 > 其他分享> > No.17 Letter Combinations of a Phone Number

No.17 Letter Combinations of a Phone Number

作者:互联网

17. 电话号码的字母组合 - 力扣(LeetCode) (leetcode-cn.com)

 

思路:一道普通的用回溯解决的组合问题,涉及到一些字符串的操作

          用一个map_string存储,用下标的索引表示数字对应的字母

package leetcode.com.backTrack;

import java.util.ArrayList;
import java.util.List;

public class Num17 {
    public static void main(String[] args) {
        Num17 tool = new Num17();
        List<String> res = tool.letterCombinations("234");
        for(String arr:res){
            System.out.println(arr);
        }
    }

    public List<String> letterCombinations(String digits) {
        List<String> ans = new ArrayList<>();
        if(digits=="" || digits.length()==1){
            return ans;
        }
        String[] map_string = {"", "*", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        StringBuffer path = new StringBuffer();
        backtrack(digits, 0, path, ans, map_string);
        return ans;
    }

    public void backtrack(String digits, int index, StringBuffer path, List<String> ans,
                          String[] map_string){
        /**
         * digits 表示输入的数字, eg: digits="23"
         * path存放字符串, 长度够了就加入 List<String> ans
         * letter 表示当前层可以选择的数字,eg: 第一层数字为2, 可选 letter=“abc"
         * index 表示选择当前层的哪一个digits中的数字
         * ans用来存储答案
         */
        if(index == digits.length()){
            ans.add(path.toString());
            return;
        }
        char tmpWord =  digits.charAt(index);
        int letterIdx = tmpWord - '0';
        String letter = map_string[letterIdx];
        for(int i=0; i<letter.length(); i++){
            path.append(letter.charAt(i));
            backtrack(digits, index+1, path, ans, map_string);
            path.deleteCharAt(path.length()-1);   // 这个地方不是删除 i , 我感觉删除i就是删除末尾的,但是不对,得直接删除当前末尾的
        }
    }
}

。。。

标签:digits,No.17,String,List,Phone,ans,Combinations,path,string
来源: https://www.cnblogs.com/charonkk/p/15419851.html