做网站难吗_挣钱吗,东莞东坑网站设计,比较好用的搜索引擎,dj网站建设1 目标值排列匹配
1.1 从目标字符串的角度来看#xff0c;LC139是一个排列问题#xff0c;因为最终目标子串的各个字符的顺序是固定的#xff1f;
当我们从目标字符串 s 的角度来看 LC139 “单词拆分” 问题#xff0c;确实可以认为它涉及到排列的概念#xff0c;但这种…1 目标值排列匹配
1.1 从目标字符串的角度来看LC139是一个排列问题因为最终目标子串的各个字符的顺序是固定的
当我们从目标字符串 s 的角度来看 LC139 “单词拆分” 问题确实可以认为它涉及到排列的概念但这种排列是在一个更宏观的层面上而不是在我们通常讨论组合和排列问题时所指的那种。
1.1.1 排列的角度
在 “单词拆分” 问题中目标字符串 s 的字符顺序是固定的。我们不能改变这些字符的顺序。我们的任务是确定是否可以通过字典中的单词这些单词的内部字符顺序也是固定的来构造出这个特定顺序的字符串。从这个角度看确实涉及到了字符的“排列”——但这是指字符串 s 和字典中单词的内部字符顺序而不是字典中单词作为整体的排列顺序。
1.1.2 组合的角度
然而当我们讨论解决这个问题的算法时我们通常将其视为一个组合问题。这是因为我们关心的是如何从字典中选择单词并且可以重复选择来构造字符串 s而不是这些单词的选择顺序。我们可以以任何顺序检查和组合这些单词只要它们最终能组合成目标字符串 s。
1.1.3 动态规划的应用
在动态规划的应用中我们通常关注的是如何逐步构建目标字符串并在每一步检查是否可以使用字典中的单词来形成当前长度的子串。这种方法更侧重于组合即哪些单词被选中来构造子串而不是单词的选择顺序。
1.1.4 总结
因此虽然从目标字符串 s 的角度来看LC139 “单词拆分” 涉及到字符的排列但在解决问题的算法层面它更像是一个组合问题。这是因为我们关注的是如何从字典中选择单词来构造字符串 s而不是这些单词的选择顺序。
1.1 Leetcode139. 单词拆分 public boolean wordBreak(String s, ListString wordDict) {int ns.length();char[]css.toCharArray();int mwordDict.size();HashSetStringsetnew HashSet(wordDict);boolean[]fnew boolean[n1];f[0]true;for(int i1;in;i){for(int j0;ji;j){if(f[j]set.contains(s.substring(j,i))){f[i]true;break;}}}return f[n];}2 背包组合问题
基本上背包问题无论从目标值角度还是元素列表角度都是组合问题
2.1 leetcode题目集合
细数Leetcode上的背包问题