1. 问题背景与解题思路
这道蓝桥杯真题考察的是字符串处理与动态规划的综合应用能力。题目描述"密码脱落"实际上是在考察如何通过最少的操作使字符串变成回文串。回文串是指正读反读都相同的字符串,比如"abba"、"abcba"。
1.1 问题本质分析
题目要求计算"密码脱落"的最小次数,实际上等价于:给定一个字符串,最少需要添加多少个字符才能使其变成回文串。有趣的是,这个数值正好等于原字符串长度减去其最长回文子序列的长度。
为什么可以这样转换?因为:
- 回文串的核心特征是对称性
- 最长回文子序列已经包含了字符串中能够形成回文的最长部分
- 剩下的字符就是需要"补充"的部分
1.2 解题思路详解
代码采用了**最长公共子序列(LCS)**的巧妙解法,具体步骤如下:
- 字符串反转:将原字符串反转得到新字符串
- 求LCS:计算原字符串和反转字符串的最长公共子序列长度
- 计算答案:原字符串长度减去LCS长度即为答案
这个方法的正确性基于一个关键观察:一个字符串的最长回文子序列,就是该字符串与其反转字符串的最长公共子序列。例如:
- 原字符串:"abac"
- 反转字符串:"caba"
- 最长公共子序列:"aba"(也是最长回文子序列)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现与解析
2.1 代码结构说明
cpp复制#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1002][1002]; // DP表
string s; // 原始字符串
char r[1002]; // 反转后的字符串
int k; // 反转字符串的索引
这段代码首先包含了必要的头文件,并声明了全局变量:
dp数组:用于动态规划的状态存储s:存储输入的原始字符串r:存储反转后的字符串k:辅助反转操作的索引
2.2 字符串反转实现
cpp复制cin>>s;
// 将原始字符串反转,存放到r数组
for(int i=s.length()-1;i>=0;i--){
r[k++]=s[i];
}
