题目大意
https://leetcode.com/problems/word-break/
给你一个目标字符串和一个字符串的List,问目标字符串是否可以被字符串的List中的若干个分解而来,已知字符串数组无重复的字符串。
注意题目中的注释,方法的第二个参数已由原来的
Set<String>
换成了List<String>
题目分析
动态规划,可以用记忆化搜索实现,我写的版本代码比较长(实际上其中一部分是二分查找)。思路是:先将List进行排序,然后对目标字符串从前往后开始搜索,对于搜索的当前位置idx,字符是str.charAt(idx)用这个字符做为字符串的首字符,在List中进行二分查找,对查找到的结果进行遍历,看哪一个可以作为前缀,然后继续向下搜索。
第二种方法,参考了讨论区里的解法,虽然解法依据的是Set<String>
,但是可以进行二分改造一下,主体的思想还是动态规划,可以看下代码。
代码
第一种解法:
|
|
复杂度:O(m * lgn * n *len)
,m是s的长度,n是数组长度
第二种解法:
|
|
复杂度:O(m * m * lgn * len)