fvdcx's blog


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

leetcode-word-break

发表于 2017-01-09   |   分类于 算法 , leetcode   |  

题目大意

  https://leetcode.com/problems/word-break/

  给你一个目标字符串和一个字符串的List,问目标字符串是否可以被字符串的List中的若干个分解而来,已知字符串数组无重复的字符串。

注意题目中的注释,方法的第二个参数已由原来的Set<String>换成了List<String>

题目分析

  动态规划,可以用记忆化搜索实现,我写的版本代码比较长(实际上其中一部分是二分查找)。思路是:先将List进行排序,然后对目标字符串从前往后开始搜索,对于搜索的当前位置idx,字符是str.charAt(idx)用这个字符做为字符串的首字符,在List中进行二分查找,对查找到的结果进行遍历,看哪一个可以作为前缀,然后继续向下搜索。

  第二种方法,参考了讨论区里的解法,虽然解法依据的是Set<String>,但是可以进行二分改造一下,主体的思想还是动态规划,可以看下代码。

阅读全文 »

leetcode-scramble-string

发表于 2017-01-08   |   分类于 算法 , leetcode   |  

题目大意

  https://leetcode.com/problems/scramble-string/

  一个字符串可以在中间任意的位置分割成两个非空串,每个非空串可以继续如此操作下去。对形成的树的任意非叶子结点可以进行交换两个子节点,最后所有叶子结点从左向右就形成了一个新串,现在给你两个字符串s1和s2,判断是否属于这种关系。

题目分析

  动态规划,可以用记忆化搜索实现,我写的版本不是最佳答案,我用了三维数组做记忆,第一维是s1的下标,第二维是s2的下标,第三维是字符串的长度。注意实现细节上,要对分割点进行枚举,同时要考虑调换的情况。然后有些小的优化的地方可以看下代码注释。

阅读全文 »

leetcode-maximum-xor-of-two-numbers-in-an-array

发表于 2017-01-02   |   分类于 算法 , leetcode   |  

题目大意

  https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/

  整数数组,找出其中异或值最大的两个数,要求时间复杂度是O(n)

题目分析

  解法参考:https://discuss.leetcode.com/topic/63213/java-o-n-solution-using-bit-manipulation-and-hashmap/17

  这里依据了一个异或的性质,就是a^b=c和a^c=b是等价的(因此一种肯定会超时并且正确的方法是从大往小遍历int值,然后第二层循环遍历nums,看nums[i]和int异或后的结果是否在nums中)。我们需要32位逐位考虑。针对每一位,首先根据掩码mask先生成前缀的set,然后再生成到当前位的newMax值,看看set中的值跟newMax结果是否在set中,如果在说明newMax是可取的。注意代码中的mask和max都是累计的,详细可以看下代码解释。

阅读全文 »

leetcode-max-product-of-word-lengths

发表于 2017-01-02   |   分类于 算法 , leetcode   |  

题目大意

  https://leetcode.com/problems/maximum-product-of-word-lengths/

  字符串数组,找出其中满足两个字符串没有公共字符的长度之积的最大值,注意字符仅是26个英文字母

题目分析

  既然只含有26个英文字母,我们可以预先扫描一下字符串数组,计算每个字符串有那些字符,然后hash到一个int,最终生成flag数组。然后O(n^2)扫描任意两个字符串,看他们flag的并运算的值,如果为0,那么就不含有公共字符,思路还是比较容易。

阅读全文 »
1…131415…38
fvdcx

fvdcx

149 日志
14 分类
20 标签
GitHub
© 2015 - 2017 fvdcx
由 Hexo 强力驱动
主题 - NexT.Pisces