首页 > 其他分享 >代码随想录训练营第38天|string虚拟头

代码随想录训练营第38天|string虚拟头

时间:2024-09-20 17:23:40浏览次数:3  
标签:38 string int MAX 随想录 vector && coin dp

322. 零钱兑换

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1,INT_MAX);
        dp[0]=0;
        for(auto& coin:coins){
            for(int i=1;i<=amount;i++){
                if(i-coin>=0&&dp[i-coin]!=INT_MAX)
                    dp[i]=min(dp[i],dp[i-coin]+1);
            }
        }
        return dp[amount]==INT_MAX?-1:dp[amount];
    }
};

dp[i]:凑够金额i所需要的最小硬币数

转移方程:给定coin,若使用,则意味着使用之前已凑够i-coin,此时最小硬币数为:dp[i-coin]+1,遍历所有可能的coin取最小。因为每种硬币的数量是无限的,所以是完全背包问题,背包的遍历采用正序。

279. 完全平方数

class Solution {
public:
    int numSquares(int n) {
        vector<int> dp(n+1,INT_MAX);
        dp[0]=0;
        for(int i=1;i<=n;i++){//物品
            for(int j=1;j<=n;j++){//背包
                if(j-i*i>=0&&dp[j-i*i]!=INT_MAX)
                    dp[j]=min(dp[j],dp[j-i*i]+1);
            }
        }
        return dp[n];
    }
};

dp[i]:凑够和i所需要的最小完全平方数

转移方程:给定i*i,若使用,则意味着使用之前已凑够j-i*i,此时最小硬币数为:dp[j-i*i]+1,遍历所有可能的i取最小。因为完全平方数可重复使用,所以是完全背包问题,背包的遍历采用正序。

139. 单词拆分

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        s=" "+s;
        int n=s.length();
        vector<int> dp(n,false);
        dp[0]=true;
        for(int i=1; i<n; i++){
            for(auto& word: wordDict){
                int j=i, k=word.length()-1;
                while(j>=0&&k>=0&&s[j]==word[k]){
                    j--;
                    k--;
                }
                if(k==-1&&dp[j]){
                    dp[i]=true;
                    break;
                }                    
            }
        }
        return dp[n-1];
    }
};

dp[i]:截止到下标i(包含i)的子串,能否被凑成。

转移方程:尝试所有可能得语料wordDict,使用双指针确认子串尾部是否可由指定word构成,如果可以,则此时dp[i]就取决于dp[i-word.length()],只要找到一个凑成的模式,就可以提前结束内层循环。 

小细节:对字符串s加入“虚拟头”空格,并定义空格可被凑成,dp[0]=true。好处:

  • 引入上述操作后,和原字符串相比,能否凑成的结果不会变化(已经定义了空格可凑成),也即,对于所求问题是等价变换。
  • 初始化容易,不需要对实际的首字符写额外逻辑。
  • 如果不加虚拟头,递推过程j时可能取-1的,用例: s = "leetcode", wordDict = ["leet", "code"]引入虚拟头就避免了该情况。

标签:38,string,int,MAX,随想录,vector,&&,coin,dp
From: https://blog.csdn.net/jiyisuifeng1991/article/details/142387173

相关文章

  • JavaSE——String类
    一、字符串构造注意:String是引用类型,内部并不存储字符串本身。有三种方式:publicclassTest1{publicstaticvoidmain(String[]args){//使用常量串构造Strings1="hellojava";System.out.println(s1);//直接newString......
  • (免费源码)计算机毕业设计必看必学 原创定制程序 java、PHP、python、小程序、文案全套
    摘 要21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对大学生实习成绩......
  • (免费源码)计算机毕业设计必看必学 原创定制程序 java、PHP、python、小程序、文案全套
    摘要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对大学生本科毕业资格审核系统等问题,对如何通过计算机大学生本科毕业资格审核系统进行研究分析,......
  • 兼收并蓄 TypeScript - 基础: string
    源码https://github.com/webabcd/TypeScriptDemo作者webabcd兼收并蓄TypeScript-基础:string示例如下:basic\string.ts{leta="\x7A";//十六进制的“7A”是字符“z”letb="\u{7A}";//十六进制的“7A”是字符“z”letc="\u{738B}";......
  • IEEE 1838-2019协议翻译——第五章 Serial test access ports
    目录5.1Primarytestaccessport5.1.1Specifications5.1.2Description5.2Primarytestaccessportcontroller5.2.1Specifications5.2.2Description5.3Secondarytestaccessport(STAP)5.3.1Specifications5.3.2Description5.......
  • 代码随想录算法训练营第十六天 | Javascript | 力扣Leetcode | 回溯 | 77. 组合、216.
    目录前言简介题目链接:77.组合题目链接:216.组合总和3题目链接:17.电话号码的字母组合前言踏平坎坷成大道,斗罢艰险又出发!自律的尽头是自控,自控的尽头是硬控。愿道友们披荆斩棘,终能得偿所愿。简介本人是小几年经验的前端开发,算法基础只有力扣几十道题,非常薄......
  • 代码随想录算法训练营第十五天 | Javascript | 继续二叉树的一天 | 力扣Leetcode | 补
    目录前言简介题目链接:501.二叉搜索树中的众数题目链接:236.二叉树的最近公共祖先题目链接:235.二叉搜索树的最近公共祖先前言踏平坎坷成大道,斗罢艰险又出发!自律的尽头是自控,自控的尽头是硬控。愿道友们披荆斩棘,终能得偿所愿。简介本人是小几年经验的前端开发,......
  • 代码随想录 -- 二叉树 -- 把二叉搜索树转换为累加树
    538.把二叉搜索树转换为累加树-力扣(LeetCode)思路:定义pre变量用来记录当前节点的前一个节点(右中左顺序遍历)的值。递归出口:当root为空时,return。单层递归逻辑:(右中左)右:self.tra(root.right)中:令root的值为它本身加上pre,更新pre为当前root的值;左:self.tra(root.left)class......
  • 代码随想录 -- 二叉树 -- 将有序数组转换为二叉搜索树
    108.将有序数组转换为二叉搜索树-力扣(LeetCode)思路:(注意题目要求是平衡二叉树!!!)递归出口:当传入数组为空时,返回空。单层递归逻辑:找到数组中间的值,令其为root,数组左边为root的左子树,数组右边为root的右子树。最后返回root。classSolution(object):defsortedArrayTo......
  • 代码随想录 -- 二叉树 -- 修剪二叉搜索树
     669.修剪二叉搜索树-力扣(LeetCode)思路:递归出口:当root为空时,返回空。当root的值比low小时,如果root没有右子树,直接返回空;否则返回trimBST(root.right,low,high)。当root的值比high大时,如果root没有左子树,直接返回空;否则返回trimBST(root.left,low,high)。单层递归逻辑:......