菜鸡刷算法的一天,每天分享两题算法,大家有这个想法的,可以给我个关注,然后一起坚持每天的算法之旅。希望我们共同进步,一起加油。 LC 17. 电话号码的字母组合 给定一个仅
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = "" 输出:[]
示例 3:
输入:digits = "2" 输出:["a","b","c"]
解题思路:将数字对应的字符放进数组中,使用递归,将每个数字进行递归,找出对应的字符,放进输出结果
代码:
var letterCombinations = function(digits) { const len = digits.length; const map = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]; //数字对应字符放进数组 if(!len) return [] if(len === 1) return map[digits].split(""); //只有一个的话,返回对应的字符 const res = [], path = []; backstracking(digits, len, 0); return res; // 递归函数 function backstracking(n, len, a) { if(path.length === len) { res.push(path.join("")); return; } for(let i of map[n[a]]){ //遍历 digits 中的所有数字 从第0个开始 path.push(i); backstracking(n, len, a + 1); path.pop(); } } };
LC
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。 给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
示例 1:
输入:s = "25525511135" 输出:["255.255.11.135","255.255.111.35"]
示例 2:
输入:s = "0000" 输出:["0.0.0.0"]
示例 3:
输入:s = "101023" 输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
解题思路:使用 str 放置切割符合条件每部分的 ip 地址的数值。然后最后再组合起来
代码:
var restoreIpAddresses = function(s) { const res = [], path = []; backtracking(0); return res; function backtracking(i) { const len = path.length; if(len > 4) return; if(len === 4 && i === s.length) { //限制长度 为4,且长度必须一样 res.push(path.join('.')); return; } for(let j = i; j < s.length; j++) { const str = s.substr(i, j - i + 1); //切割字符放进 str if(str.length > 3 || str > 255) break; //str长度限制 if(str.length > 1 && str[0] === '0') break; path.push(str); backtracking(j + 1); path.pop() } } };