No.17 Letter Combinations of a Phone Number
阿新 • • 發佈:2021-10-18
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, intindex, 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就是刪除末尾的,但是不對,得直接刪除當前末尾的 } } }
。。。