算法 编辑距离 给你两个单词 word1 和 word2。 请返回将 word1 转换成 word2 所使用的最少操作数。 可以对一个单词进行如下三种操作: * 插入一个字符 * 删除一个字符 * 替换一个字符 示例 1: 输入:word1 = "horse", word2 = "ros" 输出:3 解释: horse -> rorse 将 'h' 替换为 'r' rorse -> rose 删除 'r' rose -> ros 删除 '
算法 最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 如果不存在公共子序列,返回 0。 一个字符串的子序列是指:在不改变字符相对顺序的情况下,删除某些字符,也可以不删除任何字符后组成的新字符串。 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。 两个字符串的公共子序列,是这两个字符串共同拥有的子序列。 示例 1: 输入:text1 = "abcde", text2 = "ace" 输出:3 解释:最长公共子序列是 "ace"
算法 最长回文子串 给你一个字符串 s,找到 s 中最长的回文子串。 回文串指的是正着读和反着读都相同的字符串。 子串必须是原字符串中连续的一段。 示例 1: 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 示例 2: 输入:s = "cbbd" 输出:"bb" 提示: * 1 <= s.length <= 1000 * s 仅由数字和英文字母组成 解法一(中心扩展): class Solution { public: string longestPalindrome(
算法 不同路径 一个机器人位于一个 m x n 网格的左上角。 机器人每次只能向下或者向右移动一步。 机器人试图达到网格的右下角。 问总共有多少条不同的路径? 示例 1: 输入:m = 3, n = 7 输出:28 示例 2: 输入:m = 3, n = 2 输出:3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 3. 向下 -> 向右 -> 向下 示例
动态规划 最长有效括号 给你一个只包含 '(' 和 ')' 的字符串 s。 请你找出最长有效括号子串的长度。 有效括号子串必须满足: * 格式正确 * 连续 * 左右括号能够正确匹配 例如,"(()())" 是格式正确的括号字符串。 示例 1: 输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()" 示例 2: 输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()" 示例 3: 输入:s = "" 输出:0 提示:
算法 分割等和子集 给你一个只包含正整数的非空数组 nums。 请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 每个数组元素只能放入其中一个子集,不能重复使用。 示例 1: 输入:nums = [1,5,11,5] 输出:true 解释:数组可以分割成 [1,5,5] 和 [11]。 示例 2: 输入:nums = [1,2,3,5] 输出:false 解释:数组不能分割成两个元素和相等的子集。 提示: * 1 <= nums.length <= 200 * 1 <= nums[i] <= 100 动态规划(0-
算法 乘积最大子数组 给你一个整数数组 nums。 请你找出数组中乘积最大的非空连续子数组,并返回该子数组所对应的乘积。 该子数组中至少包含一个数字。 测试用例的答案是一个 32 位整数。 请注意,一个只包含一个元素的数组的乘积就是这个元素的值。 示例 1: 输入:nums = [2,3,-2,4] 输出:6 解释:子数组 [2,3] 有最大乘积 6。 示例 2: 输入:nums = [-2,0,-1] 输出:0 解释:结果不能为 2,因为 [-2,-1] 不是子数组。 提示: * 1 <= nums.length <= 2 * 10^
算法 最长递增子序列 给你一个整数数组 nums,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除或不删除数组中的元素,并且不改变其余元素的顺序。 例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 输入:nums = [10,9,2,5,3,7,101,18] 输出:4 解释:最长递增子序列是 [2,3,7,101],因此长度为 4。 示例 2: 输入:nums = [0,1,0,3,
动态规划 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。 如果可以利用字典中出现的一个或多个单词拼接出 s,则返回 true。 注意: * 不要求字典中出现的单词全部都使用。 * 字典中的单词可以重复使用。 示例 1: 输入:s = "leetcode", wordDict = ["leet", "code"] 输出:true 解释:返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。 示例 2: 输入:s = "applepenapple&
算法 零钱兑换 给你一个整数数组 coins,表示不同面额的硬币;以及一个整数 amount,表示总金额。 计算并返回可以凑成总金额所需的最少硬币个数。 如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币的数量是无限的。 示例 1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = 5 + 5 + 1 示例 2: 输入:coins = [2], amount = 3 输出:-1 示例 3: 输入:coins = [1], amount = 0 输出:0 提示: * 1 <= coins.length
算法 完全平方数 给你一个整数 n,返回和为 n 的完全平方数的最少数量。 完全平方数是一个整数,其值等于另一个整数的平方。换句话说,它的值等于一个整数自乘的积。 例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。 示例 1: 输入:n = 12 输出:3 解释:12 = 4 + 4 + 4 示例 2: 输入:n = 13 输出:2 解释:13 = 4 + 9 提示: * 1 <= n <= 10^
算法 杨辉三角 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入:numRows = 5 输出:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入:numRows = 1 输出:[[1]] 提示: * 1 <= numRows <= 30 动态规划-逐行构造: class Solution { public:
算法 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2
算法 最大子数组和 给你一个整数数组 nums,请你找出一个具有最大和的连续子数组,子数组最少包含一个元素,返回其最大和。 子数组是数组中的一个连续部分。 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6。 示例 2: 输入:nums = [1] 输出:1 示例 3: 输入:nums = [5,4,-1,7,8] 输出:23 提示: * 1
算法 石子游戏 IV Alice 和 Bob 两个人轮流玩一个游戏,Alice 先手。 一开始,有 n 个石子堆在一起。每个人轮流操作,正在操作的玩家可以从石子堆里拿走 任意 非零 平方数 个石子。 如果石子堆里没有石子了,则无法操作的玩家输掉游戏。 给你正整数 n ,且已知两个人都采取最优策略。如果 Alice 会赢得比赛,那么返回 True ,否则返回 False 。 示例 1: 输入:n = 1 输出:true 解释:Alice 拿走 1 个石子并赢得胜利,因为 Bob 无法进行任何操作。 示例 2: 输入:n = 2 输出:false
算法 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2: 输入:height = [4,
算法 石子游戏 II Alice 和 Bob 继续他们的石子游戏。许多堆石子 排成一行,每堆都有正整数颗石子 piles[i]。游戏以谁手中的石子最多来决出胜负。 Alice 和 Bob 轮流进行,Alice 先开始。最初,M = 1。 在每个玩家的回合中,该玩家可以拿走剩下的 前 X 堆的所有石子,其中 1 <= X <= 2M。然后,令 M = max(M, X)。 游戏一直持续到所有石子都被拿走。 假设 Alice 和 Bob 都发挥出最佳水平,返回 Alice 可以得到的最大数量的石头。 示例 1: 输入:piles = [2,
算法 石子游戏Ⅲ Alice 和 Bob 继续他们的石子游戏。几堆石子 排成一行 ,每堆石子都对应一个得分,由数组 stoneValue 给出。 Alice 和 Bob 轮流取石子,Alice 总是先开始。在每个玩家的回合中,该玩家可以拿走剩下石子中的的前 1、2 或 3 堆石子 。比赛一直持续到所有石头都被拿走。 每个玩家的最终得分为他所拿到的每堆石子的对应得分之和。每个玩家的初始分数都是 0 。 比赛的目标是决出最高分,得分最高的选手将会赢得比赛,比赛也可能会出现平局。 假设 Alice 和 Bob 都采取 最优策略 。 如果 Alice 赢了就返回 "Alice" *,Bob 赢了就返回 "Bob",*分数相同返回 "Tie&
动态规划 预测赢家 给你一个整数数组 nums 。玩家 1 和玩家 2 基于这个数组设计了一个游戏。 玩家 1 和玩家 2 轮流进行自己的回合,玩家 1 先手。开始时,两个玩家的初始分值都是 0 。每一回合,玩家从数组的任意一端取一个数字(即,nums[0] 或 nums[nums.length - 1]),取到的数字将会从数组中移除(数组长度减 1 )。玩家选中的数字将会加到他的得分上。当数组中没有剩余数字可取时,游戏结束。 如果玩家 1 能成为赢家,返回 true 。如果两个玩家得分相等,同样认为玩家 1 是游戏的赢家,也返回 true 。你可以假设每个玩家的玩法都会使他的分数最大化。 示例 1: 输入:nums