LeetCode题目:17. 电话号码的字母组合

题目

题目链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
题目解析:
这道题如果用循环的话,我发现要好多层,如果用递归的话就好很多。
但是递归我不太熟,所以只能大概说一下思路。
题目大意很简单,就是根据给的数字组成不同组合的字符串
就拿“23”来举例
LeetCode题目:17. 电话号码的字母组合_第1张图片
就是这样递归,看代码比较清楚一点

代码

class Solution {
	//用map集合将数字对应的字符串保存好
    Map<String, String> map = new HashMap<String, String>(){{
	put("2", "abc");
	put("3", "def");
	put("4", "ghi");
	put("5", "jkl");
	put("6", "mno");
	put("7", "pqrs");
	put("8", "tuv");
	put("9", "wxyz");
	}};
	//创建list集合用来存放答案
	List<String> list = new ArrayList<>();
	//主函数
	public List<String> letterCombinations(String digits) {
		if(digits.length()==0)
			return list;
		go("",digits);
		return list;
    }
    //递归函数用来连接字符串,str为上一个连接的字符串,digits为上一个切割后剩下的字符串
	private void go(String str, String digits) {
		//如果digits剩下为空,说明数字被切割完递归完成返回
		if(digits.equals("")) {
			list.add(str);
			return;
		}
		//num用来存放切割下来的数字
		String num = digits.substring(0,1);
		//digits切割下刚才的数字
		digits = digits.substring(1);
		//从map中找到刚才的数字对应的字符串并保存到ans字符串中
		String ans = map.get(num);
		//遍历循环,将字符串中的字母添加到上一个字符串的后面然后继续递归
		for(int i = 0;i<ans.length();i++) {
			String letter = ans.substring(i,i+1);
			go(str+letter,digits);
		}
		return;
	}
}

你可能感兴趣的:(LeetCode,字符串,leetcode)