1. 题目背景与核心考察点
这道题目来自蓝桥杯2016年第七届真题,属于典型的字符串处理与动态规划结合类题型。题目描述了一个关于密码脱落的有趣场景:原始密码是由大写字母组成的字符串,但在传输过程中部分字符脱落了。现在给定脱落后剩余的字符串,要求计算出最少需要插入多少个字符才能使其重新成为回文串。
回文串是指正读反读都相同的字符串,比如"ABCBA"或"ABBA"。这道题本质上考察的是:
- 对回文串性质的理解
- 动态规划算法的应用能力
- 字符串操作的基本功
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与解法思路
2.1 问题转化
首先我们需要明确题目要求:给定字符串s,求最少需要插入多少个字符才能使其成为回文串。这可以转化为另一个等价问题:求字符串s中最长的回文子序列(不一定连续)的长度l,然后用字符串长度n减去l,即n-l就是需要插入的最少字符数。
为什么这样转化是正确的?因为最长的回文子序列已经构成了字符串的核心对称部分,我们只需要在适当位置补上缺失的字符就能完成整个回文串的构建。
2.2 动态规划解法
动态规划是解决这类问题的最佳选择。我们定义dp[i][j]表示字符串s从i到j的子串中最长回文子序列的长度。状态转移方程如下:
-
当s[i] == s[j]时:
dp[i][j] = dp[i+1][j-1] + 2 -
当s[i] != s[j]时:
dp[i][j] = max(dp[i+1][j], dp[i][j-1])
边界条件:
- 当i == j时,dp[i][j] = 1(单个字符本身就是回文)
- 当i > j时,dp[i][j] = 0
最终结果是n - dp[0][n-1],其中n是字符串长度。
2.3 算法实现步骤
- 初始化一个n×n的二维数组dp,全部置0
- 处理长度为1的子串(对角线元素置1)
- 按照子串长度从2到n逐步计算
- 对于每个子串,根据首尾字符是否相等选择状态转移方程
- 最终返回n - dp[0][n-1]
3. 代码实现与解析
python复制def min_insertions(s):
n = len(s)
dp = [[0] * n for _ in range(n)]
for i in r
