最短回文串(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)
方法二:
另一种方法是将原串与原串的倒序做