Day 15
第718题:
给两个整数数组 A
和 B
,返回两个数组中公共的、长度最长的子数组的长度。(来自LeetCode)
1、肯定可以使用暴力求解,将A和B中的所有子串相比较,来算处它们的最大前缀的长度,就可得出公共子数组的长度了,时间复杂度较高
看到提示说用dp[i][j]数组来记录此时可A和B数组当前的最大公共长度;
就是说当此是 i 和 j 指向的位置如果相同的话,那么此时dp[i][j]的值就位dp[i-1][j-1]的值+1,因为公共的长度添加了一个;
但是如果此时指向的位置不相同的话,那么就设置dp[i][j]为0,因为公共长度此时没有了;
中间需要用一个res来保存当前的最长公共长度。
2、滑动窗口的方式:将A数组的头部依次和B数组的任意位置对齐,比较此时的最长公共子串;
将B数组的头部依次和A数组的任意位置对其,比较此时的最长公共子串;
(其实就是相当于将A的头部和尾部依次和B数组的任意位置对其,比较最长字串长度)
最终返回最长的子串长度。
第17题:
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。(来自LeetCode)
1、2-9每个数字代表一串字符串,给定的字符串可以是1-9个,当是一个时,将其代表的字符串内的字符依次推入集合在输出即可;
但是如果数字是9个时,就代表9个字符串内地字符任意组合,组合较多,如果用循环的话,就相当于要9次循环,这里可以用递归解决;
首先用数组或者集合来存储数字和字符串的对应关系;
只有当号码的最后一位为空时才结束;例如23456
当得到第一个号码数字2时,取出对应的字符串abc,然后取出字符串内的第一个字符a;
此时开始递归下一个号码数字3,依次下去,这样首先得出来的就是2345的代表的字符串的首字符和6代表的所有字符的组合;
然后再返回到5代表的第二个字符,再得出来234的首字符加上5的第二个字符和6的代表的所有字符的组合;
这样一次递归下去,得出所有的字符组合。