思路
看提示说是用回溯法。我没用这种方法。
简单思路,记录数字对字母的映射。
每处理一个数字,将当前结果集的所有元素 连接 当前数字对应的每个字母
有点暴力的意思
详细代码
// An highlighted block
class Solution {
/**
* @param String $digits
* @return String[]
*/
function letterCombinations($digits) {
$map = array(
'2' => array('a', 'b', 'c'),
'3' => array('d', 'e', 'f'),
'4' => array('g', 'h', 'i'),
'5' => array('j', 'k', 'l'),
'6' => array('m', 'n', 'o'),
'7' => array('p', 'q', 'r', 's'),
'8' => array('t', 'u', 'v'),
'9' => array('w', 'x', 'y', 'z'),
);
// 记录最后结果
$result = array();
$len = strlen($digits);
for($i = 0; $i < $len; $i++) {
$digit = $digits[$i];
$letters = $map[$digit];
// 如果是第一个数字,则把对应的所有字母加入结果集
if (count($result) == 0) {
foreach ($letters as $letter) {
array_push($result, $letter);
}
} else {
foreach ($result as $item) {
/*
连接新的字母之前,需要把之前的元素删除
比如样例中"23", 2对应{'a','b','c'}
此时结果集为{'a','b','c'},
处理3时,对应字母{'d','e','f'}
如果不删除。最后结果集会包含{'a','b','c'}
*/
$key = array_search($item, $result);
unset($result[$key]);
foreach($letters as $letter) {
$newItem = $item . $letter;
array_push($result, $newItem);
}
}
}
}
return $result;
}
}
结果
执行结果:
通过
执行用时 :8 ms, 在所有 PHP 提交中击败了97.06%的用户
内存消耗 :14.8 MB, 在所有 PHP 提交中击败了27.59%的用户