“目标值排列匹配“和“背包组合问题“的区别和leetcode例题详解

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. 单词拆分

java 复制代码
    public boolean wordBreak(String s, List<String> wordDict) {
        int n=s.length();
        char[]cs=s.toCharArray();
        int m=wordDict.size();

        HashSet<String>set=new HashSet<>(wordDict);
        boolean[]f=new boolean[n+1];
        f[0]=true;

        for(int i=1;i<=n;i++){
            for(int j=0;j<i;j++){
                if(f[j]&&set.contains(s.substring(j,i))){
                    f[i]=true;
                    break;
                }
            }
        }
        return f[n];
    }

2 背包组合问题

基本上背包问题无论从目标值角度还是元素列表角度都是组合问题

2.1 leetcode题目集合

细数Leetcode上的背包问题

相关推荐
czlczl2002092521 小时前
算法:二叉树的公共祖先
算法
稚辉君.MCA_P8_Java1 天前
Gemini永久会员 Java动态规划
java·数据结构·leetcode·排序算法·动态规划
小白程序员成长日记1 天前
2025.11.23 力扣每日一题
算法·leetcode·职场和发展
16_one1 天前
autoDL安装Open-WebUi+Rag本地知识库问答+Function Calling
人工智能·后端·算法
散峰而望1 天前
C++数组(三)(算法竞赛)
开发语言·c++·算法·github
q***95221 天前
SpringMVC 请求参数接收
前端·javascript·算法
初级炼丹师(爱说实话版)1 天前
多进程与多线程的优缺点及适用场景总结
算法
hetao17338371 天前
2025-11-25~26 hetao1733837的刷题记录
c++·算法
历程里程碑1 天前
各种排序法大全
c语言·数据结构·笔记·算法·排序算法
少许极端1 天前
算法奇妙屋(十四)-简单多状态dp问题
算法·动态规划·图解算法·简单多状态dp·打家劫舍问题·买卖股票问题全解