【JAVA编程】电话号码的字母组合

一、题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述

示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]

示例 2:
输入:digits = “”
输出:[]

示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]

提示:
0 <= digits.length <= 4
digits[i] 是范围 [‘2’, ‘9’] 的一个数字。

二、问题分析

根据输入字符串的条件,可以按字符串的长度进行划分。
当输入数字字符串长度为0时,返回空;
当输入数字字符串长度为1时,返回的是该数字对应的字母组合,比如输入为"9",返回[“w”, “x”, “y”, “z”],代码示例如下:

String[] numstr = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
int index0;

if (digits.length() == 1) {
	index0 = digits.charAt(0) - '2';
	for (int i = 0; i < numstr[index0].length(); i++) {
		onestr.add(Character.toString(numstr[index0].charAt(i)));
	}
}

当输入数字字符串长度为2时,返回的是两个数字对应的字母全排列组合,比如输入为"67"时,字母全排列后返回为[“mp”, “mq”, “mr”, “ms”, “np”, “nq”, “nr”, “ns”, “op”, “oq”, “or”, “os”],代码示例如下:
在这里插入图片描述

String[] numstr = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
int index0, index1;

if (digits.length() >= 2) {
	index0 = digits.charAt(0) - '2';
	index1 = digits.charAt(1) - '2';
	for (int i = 0; i < numstr[index0].length(); i++) {
		for (int j = 0; j < numstr[index1].length(); j++) {
			onestr.add(Character.toString(numstr[index0].charAt(i)) + Character.toString(numstr[index1].charAt(j)));
		}
	}
}

当输入数字字符串长度为3时,返回的是三个数字对应的字母全排列组合,代码实现时,可以采取三层循环的方式,分别循环遍历三个数字对应的字母进行全排列,但从减少圈复杂度考虑,可以取前两个数字的字母跟后一个数字的字母全排列的方式实现。
比如输入为“678“时,可以取"67"对应的排列结果,与"8"对应的字母进行二次排列组合,得到最终的结果。
在这里插入图片描述
当输入数字字符串长度为4时,返回的是四个数字对应的字母全排列组合,代码实现时,可以取前两个数字的字母跟后两个数字的字母全排列的方式实现。
比如输入为“6789“时,可以取"67"对应的排列结果,与"89"对应的字母进行二次排列组合,得到最终的结果。
在这里插入图片描述
相对应代码实现如下:

String[] numstr = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
int index0, index1;

if (digits.length() >= 2) {
	index0 = digits.charAt(0) - '2';
	index1 = digits.charAt(1) - '2';
	for (int i = 0; i < numstr[index0].length(); i++) {
		for (int j = 0; j < numstr[index1].length(); j++) {
			onestr.add(Character.toString(numstr[index0].charAt(i)) + Character.toString(numstr[index1].charAt(j)));
		}
	}
}
if (digits.length() == 3) {
	index0 = digits.charAt(2) - '2';
	for (int i = 0; i < numstr[index0].length(); i++) {
		twostr.add(Character.toString(numstr[index0].charAt(i)));
	}
} else if (digits.length() == 4) {
	index0 = digits.charAt(2) - '2';
	index1 = digits.charAt(3) - '2';
	for (int i = 0; i < numstr[index0].length(); i++) {
		for (int j = 0; j < numstr[index1].length(); j++) {
			twostr.add(Character.toString(numstr[index0].charAt(i)) + Character.toString(numstr[index1].charAt(j)));
		}
	}
}
// 取前两个数字结果与后一个/两个数字结果进行全排列
if (digits.length() > 2) {
	for (int i = 0; i < onestr.size(); i++) {
		for (int j = 0; j < twostr.size(); j++) {
			retstr.add(onestr.get(i) + twostr.get(j));
		}
	}
	return retstr;
}

三、代码实现

完整代码实现如下:

static public List<String> letterCombinations(String digits) {
   	List<String> retstr = new ArrayList<>();
   	List<String> onestr = new ArrayList<>();
   	List<String> twostr = new ArrayList<>();
   	String[] numstr = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
   	int index0, index1;
   	
   	if (digits.length() == 1) {
   		index0 = digits.charAt(0) - '2';
   		for (int i = 0; i < numstr[index0].length(); i++) {
   			onestr.add(Character.toString(numstr[index0].charAt(i)));
   		}
   	} else if (digits.length() >= 2) {
   		index0 = digits.charAt(0) - '2';
   		index1 = digits.charAt(1) - '2';
   		for (int i = 0; i < numstr[index0].length(); i++) {
   			for (int j = 0; j < numstr[index1].length(); j++) {
   				onestr.add(Character.toString(numstr[index0].charAt(i)) + Character.toString(numstr[index1].charAt(j)));
   			}
   		}
   	}
   	
   	if (digits.length() == 3) {
   		index0 = digits.charAt(2) - '2';
   		for (int i = 0; i < numstr[index0].length(); i++) {
   			twostr.add(Character.toString(numstr[index0].charAt(i)));
   		}
   	} else if (digits.length() == 4) {
   		index0 = digits.charAt(2) - '2';
   		index1 = digits.charAt(3) - '2';
   		for (int i = 0; i < numstr[index0].length(); i++) {
   			for (int j = 0; j < numstr[index1].length(); j++) {
   				twostr.add(Character.toString(numstr[index0].charAt(i)) + Character.toString(numstr[index1].charAt(j)));
   			}
   		}
   	}
   	// 取前两个数字结果与后一个/两个数字结果进行全排列
   	if (digits.length() > 2) {
   		for (int i = 0; i < onestr.size(); i++) {
   			for (int j = 0; j < twostr.size(); j++) {
   				retstr.add(onestr.get(i) + twostr.get(j));
   			}
   		}
   		return retstr;
   	}
   	return onestr;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值