回文词

lzusa 发布于 2019-04-07 1131 次阅读


题目描述

 回文词是一种对称的字符串,也就是说:一个回文词,从左向右读和从右向左读的结果都是一样的.任意给定一个字符串,通过插入若干个字符,都可以变成一个回文词.你的任务是写一个程序,求出给定字符串变成回文词所需插入的最小字符数.
比如,字符串”Ab3db”,在插入两个字符后可以变成一个回文词(“dAb3bAd”,”Adb3bdA”),然而,插入两个以下的字符无法使它变成一个回文词.

输入

  输入文件的第一行包含一个数N,表示给定字符串的长度(3<=N<=5000)
    文件的第二行是一个长度为N的字符串。字符串仅由大写字母,小写字母,和数字构成。大写字母和小写字母被认为是不同的。

输出

输出只包括一行,包含一个整数,表示需要插入的字符数。

思路

将这个字符串的正序和倒序跑一边最长公共子串,然后用长度减去它就可以了

var
  lena,lenb,i,j,k,max,n:longint;
  f:array[0..5000,0..5000] of integer;
  a,b,s,l:ansistring;
begin
  readln(n);
  readln(l);   
  k:=n;
      a:='';
      b:='';
      for i:=1 to k do
        a:=a+l[i];
      for i:=length(l) downto 1 do
        b:=b+l[i];
      lena:=length(a);
      lenb:=length(b);
      fillchar(f,sizeof(f),0);
      for i:=1 to lena do
        for j:=1 to lenb do
          if a[i]=b[j]
            then f[i,j]:=f[i-1,j-1]+1
            else if f[i-1,j]>f[i,j-1]
                then f[i,j]:=f[i-1,j]
                else f[i,j]:=f[i,j-1];
      if max
]]>