摘要: 1. 题目 2. 解答 我们先来看一看回文子串的规律,如果回文子串的长度为偶数,那么其中所有的每个元素都出现了偶数次;如果回文子串的长度为奇数,那么有一个元素出现了奇数次而其余每个元素都出现了偶数次。 所以我们需要做的就是遍历一遍字符串,统计每个元素出现的次数。这里只有大写字母和小写字母,我们用一个 阅读全文
posted @ 2019-12-05 18:43 seniusen 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 1. 题目 2. 解答 与最长回文子串类似,我们可以用动态规划来求解这个问题,只不过这里的子序列可以不连续。我们定义状态 state[i][j] 表示子串 s[i, j] 的最长回文子序列长度,那么状态转移方程为: $$state[i][j] = 1 \space 如果 \space i = j$$ 阅读全文
posted @ 2019-12-05 18:41 seniusen 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 1. 题目 2. 解答 我们定义状态 state[i][j] 表示子串 s[i, j] 是否为回文子串,如果 s[i, j] 为回文子串,并且有 s[i 1] == s[j+1],那么 s[i 1, j+1] 也为回文子串。状态转移方程为: $$state[i][j] = 1 \space 如果 \ 阅读全文
posted @ 2019-12-05 18:39 seniusen 阅读(117) 评论(0) 推荐(0) 编辑
摘要: 1. 题目 2. 解答 2.1. 动态规划 我们定义状态 state[i] 表示以 nums[i] 为结尾元素的最长上升子序列的长度,那么状态转移方程为: $$state[i] = max(state[j] + 1) \space 如果 \space nums[i] nums[j], 0 \leqs 阅读全文
posted @ 2019-12-05 18:37 seniusen 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 1. 最长公共子串 最长公共子串与最长公共子序列有一些类似,只不过这里子串要求是连续的。 这里我们定义 lcs[i][j] 表示 以 s[i] 与 t[j] 为末尾元素 的最长公共子串长度,那么我们有: $$lcs[i][j] = \begin{cases} lcs[i 1][j 1]+1 &\te 阅读全文
posted @ 2019-12-05 18:34 seniusen 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 1. 如何衡量字符串的相似性 如何量化两个字符串之间的相似性呢?我们可以用 编辑距离 ,也就是将一个字符串通过增、删、替换字符转化成另一个字符串需要的最少编辑次数。编辑距离越小,说明两个字符串越相似。 其中,莱文斯坦距离允许增、删和替换操作,表示两个字符串差异的大小;最长公共子序列只允许增删操作,表 阅读全文
posted @ 2019-12-05 18:31 seniusen 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 1. 什么是动态规划 动态规划一般用来求解最优问题,这些问题一般都可以分为若干个决策阶段,每次决策对应着一组状态。我们要做的就是寻找出一组决策序列,这组决策序列能产生我们期望的最优解。 能用动态规划求解的问题有以下三个特征: 最优子结构 ,当一个问题的优化解包含了子问题的优化解时,我们说这个问题具有 阅读全文
posted @ 2019-12-05 18:28 seniusen 阅读(480) 评论(0) 推荐(0) 编辑