两个字符串的编辑距离又称为Levenshtein距离,指第一个字符串经过插入、删除、替换字符操作之后变成第二个字符串所要进行的操作的最少步骤数。一般使用动态规划DP来实现。
d[i][j]表示长度为i的子串S1[0..i-1]与长度为j的子串S2[0..j-1]之间的编辑距离,则
d[0][j]=j;(S1子串执行j次插入操作与S2子串相同)
d[i][0]=i;(S1子串执行i次删除操作与S2子串相同)
d[i][j]=Min{d[i-1][j]+1/*表示S1[0..i-2]先转化为S2[0..j-1]之后,再删除S1[i-1]*/,
d[i][j-1]+1/*表示S1[0..i-1]先转化为S2[0..j-2]之后,在插入S2[j-1]*/,
S1[i]==S2[j]?(d[i-1][j-1]):(1+d[i-1][j-1])/*替换操作*/ }
最后d[len1][len2]即为S1和S2的编辑距离。
问题:Find minimum number of characters that need to be inserted into a string (anywhere in the string) to make it a palindrome.
考察字符串变化之后以第i个字符作为回文的轴,此时,插入操作就是在S[0..i-1]或者S[n..i+1]中插入字符,使两个子串相同
“在S[0..i-1]或者S[n..i+1]中插入字符,使两个子串相同”操作可以看作类似求两个字符串的编辑距离,(只能进行另个字符串的插入,其中一个字符串的插入操作可以看作是对另个字符串相应字符的删除)
这种情况下两个字符串之间的编辑距离的计算:
d[0][j] = j; (S1子串中执行j次插入操作)
d[i][0] = i; (S2子串中执行i次插入操作)
d[i][j] = Min{d[i-1][j]+1/*表示S1[0..i-2]与S2[0..j-1]相等转化之后,再在S2[j-1]之后插入S1[i-1]*/,
d[i][j-1]+1/*表示S1[0..i-1]与S2[0..j-2]相等转化之后,再在S1[i-1]之后插入S2[j-1]*/,
S[i]==S[j]?d[i-1][j-1]:(2+d[i-1][j-1])/*表示S1[0..i-2]与S2[0..j-2]相等转化之后,在S1[i-1]之后插入S2[j-1],在S2[j-1]之前插入S1[i-1]*/}
对于本题,先求出S和S的逆序字符串S‘之间的d[len][len]矩阵,然后判断可以使S转化为回文的操作的最小距离。
S前半段的字符数i取值0..len,后半段的字符数取值len-i(回文字符数位偶数)和len-i-1(回文字符数位奇数,且以S中第i个字符作为轴),插入的最小字符数:
minCount=Min{d[i][len-i], d[i][len-i-1]} (0<=i<=len)
时间复杂度 O(n^2) 空间复杂度O(n^2) (小女子只能想到这个方法)