17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方

授权,非商业转载请注明出处。

 

解题思路如下:

1,输入数字只有2-9,每个数字对应不同的字符,写一个二维数组,和数字对应

2,字符串拼接规则为:第一个数字对应的字符和后面每个数字对应的字符进行逐个匹配即可

3,字符串拼接,比较耗时,使用字符数组确定新的字符串,字符数组可重复利用

 

代码如下:

package org.dai.io.cmd.command;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 * 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
 * 
 * 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
 * 
 * 
 * 
 * 示例:
 * 
 * 输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
 * 
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 * 
 * @author daipl
 *
 */
public class Solution9 {

	public static void main(String[] args) {
		Solution9 so3 = new Solution9();
		int[] nums = new int[] { 3, 0, -2, -1, 1, 2 };
		List<String> rs = so3.letterCombinations("23");
		System.out.println(rs);

	}

	public List<String> letterCombinations(String digits) {
		
		//从2开始,每个字符对应的字符数组
		char cs[][] = new char[][] { { 'a', 'b', 'c' }, { 'd', 'e', 'f' }, { 'g', 'h', 'i' }, { 'j', 'k', 'l' },
				{ 'm', 'n', 'o' }, { 'p', 'q', 'r', 's' }, { 't', 'u', 'v' }, { 'w', 'x', 'y', 'z' } };
		List<String> rsList = new ArrayList<String>();
		if (digits == null || digits.length() == 0) {
			return rsList;
		}
		//转换为数组,这样效率更高
		char[] dgCs = digits.toCharArray();
		//目标字符数组
		char[] strCs = new char[dgCs.length];
		int index = 0;
		listLetter(cs, dgCs, index, strCs, rsList);
		return rsList;
	}

	private void listLetter(char[][] cs, char[] dgCs, int dgIndex, char strCs[], List<String> rsList) {
		//当前的字符串
		char curC = dgCs[dgIndex];
		//当前字符串在从2开始的位置
		int index = curC - '2';
		//当前字符对应的字符数组
		char[] curCS = cs[index];

		if (dgIndex == dgCs.length - 1) {
			//如果已经到最后一个了,那么设置后,添加到结果list中
			for (char c : curCS) {
				strCs[dgIndex] = c;
				rsList.add(new String(strCs));
			}
		} else {
			//否则,递归调用,设置下一个字符的数据
			for (char c : curCS) {
				strCs[dgIndex] = c;
				this.listLetter(cs, dgCs, dgIndex + 1, strCs, rsList);
			}
		}

	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值