问题描述 如题. 例:输入两个字符串 str1="1AB234",str2="1234EF" ,应输出最长公共子串"234". 解题思路 状态表示 dp[i][j]表示把str1[I]和str2[j]作为公共子串的最后一个字符,最长公共子串的长度. 最终,找到dp数组中的最大值及其位置,则可计算并获得最长子串. 状态转移方程 dp[i][j]=dp[i-1][j-1]+1 ,(str[i]==str[j]) dp[i][j]=0,(str[I]!…
题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的方法数. 解题思路 完全背包 和"求换钱的最少张数"的转移来的状态完全相同. 初始化不同 转移方程为:dp[i][j]=dp[i-1][j]+dp[i][j-arr[i]] 代码 public class Solution { public int getMeansCnt(int arr[],int aim){ int[] dp=new i…
题意 给一个字符串,只由数字组成,若是'1'-'26',则认为可以转换为'a'-'z'对应的字母,问有多少种转换方法. 题解 状态转移很好想,注意dp多开一位,dp[0]为dp[2]的计算做准备.dp[i]表示到索引为i-1的字符(含)为止转换方法数. 代码 public class Main { public static void main(String args[]) { String str="01"; System.out.print(transMeans(str)); }…
题目 给定一个整型数组arr,代表数值不同的纸牌排成一条线.玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明.请返回最后获胜者的分数. 例子 arr=[1,2,100,4]. 开始时玩家A只能拿走1或4.如果玩家A拿走1,则排列变为[2,100,4],接下来玩家B可以拿走2或4,然后继续轮到玩家A.如果开始时玩家A拿走4,则排列变为[1,2,100],接下来玩家B可以拿走1或100,然后继续轮到玩家A.玩家A作为绝顶聪…
问题描述 输入 原字符串StrOrg,目标字符串StrTarget,插入.删除.替换的编辑代价ic,dc,rc.输出将原字符串编辑成目标字符串的最小代价. 解题思路 状态表示 dp[i][j]表示把strOrg[0:i]编辑成strTarget[0:j]的最小代价. 状态转移方程 从以下三种状态的取最小即可: 删除:dp[i][j]=dp[i-1][j]+dc.原串删除最后一个元素,再转移到目标串 插入:dp[i][j]=dp[i][j-1]+ic.原串变为目标元素删除最后一个元素,再插入最后一…
题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的最少货币数. 解题思路 dp[i][j]表示只用第0到i种货币,凑成j元的最小货币张数. 初始化第一行 初始化中,无法凑成的初始化为Integer.MAX_VALUE-1否则+1会爆精度变为负数. 转移方程: dp[i][j]=min{dp[i-1][j-k*arr[i]]+k} (k>=0) 整理得 dp[i][j]=min{dp[i-1][j],…
题目描述 一行N个位置1到N,机器人初始位置M,机器人可以往左/右走(只能在位置范围内),规定机器人必须走K步,最终到位置P.输入这四个参数,输出机器人可以走的方法数. 解题思路 DP 方法一:时间复杂度O(NK),空间复杂度O(NK) 方法二:时间复杂度O(NK),空间复杂度O(N) 方法一代码 public class Solution { //ans=walk(N,M,K,P); public int walk(int N,int cur,int rest,int P) { int[][]…
原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失.“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化.书中将所有的面试题从难到易依次分为“将.校.尉.士”四个档次,…
  第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一个栈的排序(士★☆☆☆) 13用栈来求解汉诺塔问题(校★★★☆) 14生成窗口最大值数组(尉★★☆☆) 19构造数组的MaxTree(校★★★☆) 22求最大子矩阵的大小(校★★★☆) 26最大值减去最小值小于或等于num的子数组数量(校★★★☆) 31第2章链表问题34打印两个有序链表的公共部分(…
题目 例:arr=[2,1,5,3,6,4,8,9,7] ,最长递增子序列为1,3,4,8,9 题解 step1:找最长连续子序列长度 dp[]存以arr[i]结尾的情况下,arr[0..i]中的最长递增子序列的长度. 额外加一个ends[]数组,初始化ends[0]=arr[0],其他为0.有一个有效区ends[0,r],只有有效区内的数才有意义.ends[i]=num表示遍历到目前,所有长度i+1的递增序列中,结尾最小的数时num. 遍历arr[i]时,在ends有效区找最左边>=arr[i…