1. 程式人生 > 其它 >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就是刪除末尾的,但是不對,得直接刪除當前末尾的 } } }

。。。