Leecode no.17 电话号码的字母组合

package com.example.demo.leecode;

import java.util.*;

/**
* 电话号码的字母组合
* @Date 2020/12/3
* @author Tang
*
* 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
* 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母
*/
public class LetterCombinationsOfAPhoneNumber {
Map<Character, char[]> numberMap = new HashMap<>(10);
List<String> resultList = new ArrayList<>();

public List<String> execute(String digits){
numberMap.put('2', new char[]{'a', 'b', 'c'});
numberMap.put('3', new char[]{'d', 'e', 'f'});
numberMap.put('4', new char[]{'g', 'h', 'i'});
numberMap.put('5', new char[]{'j', 'k', 'l'});
numberMap.put('6', new char[]{'m', 'n', 'o'});
numberMap.put('7', new char[]{'p', 'q', 'r', 's'});
numberMap.put('8', new char[]{'t', 'u', 'v'});
numberMap.put('9', new char[]{'w', 'x', 'y', 'z'});

char[] chars = digits.toCharArray();

getString(chars, 0, "");

return resultList;
}

/**
* 我的思路好像有点奇怪
* 递归
* 从索引0开始 遍历数字数组
* foreach循环 将数字对应的几个字母分别append到StringBuilder中,再递归执行下一个数字
* 直到数字数组到头了
*
* @param numbers 传入的数字数组
* @param index 索引 当前应该append数字数组第几个了
* @param temp append完组成的String字符串 传给下一个数字去append 直到数字数组到头了
* @return 返回值boolean 用来判断当前组成的String字符串是否可以添加到结果集合 (当不能再append了 返回true)
*/
private boolean getString(char[] numbers, int index, String temp ){
if(index > numbers.length - 1){
return true;
}

char[] chars = numberMap.get(numbers[index]);

for (char c: chars) {
StringBuilder stringBuilder = new StringBuilder(temp);
stringBuilder.append(c);
boolean b = getString(numbers, index + 1, stringBuilder.toString());
if(b){
resultList.add(stringBuilder.toString());
}
}
return false;
}


public static void main(String[] args) {

System.out.println(new LetterCombinationsOfAPhoneNumber().execute("2369"));
}

}
posted @ 2020-12-03 18:25  六小扛把子  阅读(101)  评论(0编辑  收藏  举报