最短回文串(palindrome.pas/c/cpp)
如果一个字符串正过来读和倒过来读是一样的,那么这个字符串就被称作回文串。例如abcdcba,abcddbca就是回文串,而abcdabcd不是。
你要解决的问题是:对于任意一个字符串,输出将这个字符串变为回文串需要插入的最少字符个数,比如,Ab3bd只需要插入2个字符就可以变为一个回文串。
输入数据
第一行是一个整数N
第二行是一个长度为N字符串S
输出数据
一行一个整数,表示将S变为回文串需要插入的最小字符个数
样例输入与输出
5
Ab3bd
2
数据范围
对于所有数据,0<n<=1992
有两种方法: 方法一: 若A形如?A'?,(问号代表任意一个相同字符,下同)则只需将A'变为回文串。
若A形如?A'或者A'?,则只需将A'变为回文串,再在A的后面或者前面插入一个”?”
定义状态f[i,j]为将Ai..Aj变为回文串的最小代价,则
f[i][j]= f[i+1][j-1] (若Ai=Aj)
min(f[i+1][j],f[i][j-1])+1 (若Ai<>Aj)
一共有n2个状态,状态转移是O(1)的,总的复杂度为O(n2)
方法二:
另一种方法是将原串与原串的倒序做一次LCS,用原串长度减去LCS长度,即为需要插入字符的个数。
lcs即

该博客介绍了如何找到使给定字符串变成回文串所需的最少插入字符数。提供了三种方法:方法一是通过动态规划实现;方法二是使用最长公共子序列(LCS)算法;方法三是基于KMP匹配,但未给出具体实现。文章包含C和Pascal两种语言的代码示例。
最低0.47元/天 解锁文章
537

被折叠的 条评论
为什么被折叠?



