leetcode第17题

简介: 假如是 "23" ,那么第 1 次 for 循环结束后变为 a, b, c;第 2 次 for 循环的第 1 次 while 循环 a 出队,分别加上 d e f 然后入队,就变成 b c ad ae af第 2 次 for 循环的第 2 次 while 循环 b 出队,分别加上 d e f 然后入队,就变成 c ad ae af bd be bf第 2 次 for 循环的第 3 次 while 循环 c 出队,分别加上 d e f 然后入队,就变成 ad ae af bd be bf cd ce cf这样的话队列的元素长度再也没有等于 1 的了就出了 while 循环。

image.png

top17

给一串数字,每个数可以代表数字键下的几个字母,返回这些数字下的字母的所有组成可能。

解法一 定义相乘

自己想了用迭代,用递归,都理不清楚,灵机一动,想出了这个算法。

把字符串 "23" 看成 ["a","b",c] * ["d","e","f"] ,而相乘就用两个 for 循环实现即可,看代码应该就明白了。

publicList<String>letterCombinations(Stringdigits) {
List<String>ans=newArrayList<String>();
for (inti=0; i<digits.length(); i++) {
ans=mul(ans, getList(digits.charAt(i) -'0'));
    }
returnans;
}
publicList<String>getList(intdigit) {
StringdigitLetter[] = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
List<String>ans=newArrayList<String>();
for (inti=0; i<digitLetter[digit].length(); i++) {
ans.add(digitLetter[digit].charAt(i) +"");
        }
returnans;
    }
//定义成两个 List 相乘publicList<String>mul(List<String>l1, List<String>l2) {
if (l1.size() !=0&&l2.size() ==0) {
returnl1;
    }
if (l1.size() ==0&&l2.size() !=0) {
returnl2;
    }
List<String>ans=newArrayList<String>();
for (inti=0; i<l1.size(); i++)
for (intj=0; j<l2.size(); j++) {
ans.add(l1.get(i) +l2.get(j));
        }
returnans;
}

解法二 队列迭代

参考这里,果然有人用迭代写了出来。主要用到了队列。


publicList<String>letterCombinations(Stringdigits) {
LinkedList<String>ans=newLinkedList<String>();
if(digits.isEmpty()) returnans;
String[] mapping=newString[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
ans.add("");
for(inti=0; i<digits.length();i++){
intx=Character.getNumericValue(digits.charAt(i));
while(ans.peek().length()==i){ //查看队首元素Stringt=ans.remove(); //队首元素出队for(chars : mapping[x].toCharArray())
ans.add(t+s);
            }
        }
returnans;
    }

假如是 "23" ,那么

第 1 次 for 循环结束后变为 a, b, c;

第 2 次 for 循环的第 1 次 while 循环 a 出队,分别加上 d e f 然后入队,就变成 b c ad ae af

第 2 次 for 循环的第 2 次 while 循环 b 出队,分别加上 d e f 然后入队,就变成 c ad ae af bd be bf

第 2 次 for 循环的第 3 次 while 循环 c 出队,分别加上 d e f 然后入队,就变成 ad ae af bd be bf cd ce cf

这样的话队列的元素长度再也没有等于 1 的了就出了 while 循环。


这种题的时间复杂度和空间复杂度自己理的不太清楚就没有写了。

相关文章
|
8月前
leetcode-1518:换酒问题
leetcode-1518:换酒问题
40 0
|
8月前
leetcode-1219:黄金矿工
leetcode-1219:黄金矿工
90 0
单链表反转 LeetCode 206
单链表反转 LeetCode 206
82 0
顺手牵羊(LeetCode844.)
好多同学说这是双指针法,但是我认为叫它顺手牵羊法更合适
89 0
LeetCode 389. 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
87 0
|
测试技术
一和零(LeetCode-474)
一和零(LeetCode-474)
145 0
一和零(LeetCode-474)
|
算法
LeetCode——944. 删列造序
LeetCode——944. 删列造序
115 0
|
存储 算法
leetcode第43题
个位乘个位,得出一个数,然后个位乘十位,全部乘完以后,就再用十位乘以各个位。然后百位乘以各个位,最后将每次得出的数相加。十位的结果要补 1 个 0 ,百位的结果要补两个 0 。相加的话我们可以直接用之前的大数相加。直接看代码吧。
leetcode第43题
|
存储
leetcode第52题
可以发现对于同一条副对角线,row + col 的值是相等的。 对于同一条主对角线,row - col 的值是相等的。 我们同样可以用一个 bool 型数组,来保存当前对角线是否有元素,把它们相加相减的值作为下标。 对于 row - col ,由于出现了负数,所以可以加 1 个 n,由 [ - 3, 3 ] 转换为 [ 1 , 7 ] 。
leetcode第52题
|
人工智能 算法
leetcode第41题
对于这种要求空间复杂度的,我们可以先考虑如果有一个等大的空间,我们可以怎么做。然后再考虑如果直接用原数组怎么做,主要是要保证数组的信息不要丢失。目前遇到的,主要有两种方法就是交换和取相反数。
100 0
leetcode第41题