最少插入字符

给定字符串,能够经过插入字符,使其变为回文。求最少插入字符的数量。例如:缓存

  1. ab最少插入1个字符,变为*b*abapp

  2. aa最少插入0个字符blog

  3. abcd最少插入3个字符,*dcb*abcd递归

分析

这个题目的分析思路,和前面两期是很是类似的:给出递归的解法,发现重复的子问题,改进为动态规划的解法,这是一个分析的过程,待同窗们比较熟悉时候,能够直接给出动态规划的解决方案,就很好了。字符串

这个题目,递归该如何解呢?给定一个字符串str,长度为n,怎么插入最少的字符,是的字符串变为回文呢?插入最少的字符,就是要尽可能利用原来的字符,在原字符串str中,尽可能利用更多可以匹配的字符。怎么对这个问题进行分解呢?考虑str字符串总体:get

  1. 若是str[0]==str[n-1],则问题转变为求str[1,n-2],插入最少字符,获得回文it

  2. 若是str[0]!=str[n-1],则须要插入一个字符要么和str[0]相同,要么和str[n-1]相同,class

    1. 若是和str[0],则转变为str[1,n-1],插入最少字符,获得回文循环

    2. 若是和str[n-1],则转变为str[0,n-2],插入最少字符,获得回文方法

上面的第2种状况中,须要取两个值最小值。则完成了问题的分解,而且,基本状况也分析彻底,则有递归式为:

fmi(str, l, h) = (str[l] == str[h]) ? fmi(str, l+1, h-1) : (min(fmi(str, i+1, h), fmi(str,l, h-1))+1)

经过上面的式子,有经验的、熟练的同窗,很直接的就能看出来,存在重复的子问题,这就意味着,咱们能够讲子问题的解缓存使用。若是,没有直接可以看出来的同窗们,仍是能够按照咱们以前的方法,把递归树画出来吧,那样更加一目了然。

那么,这个题目该如何用动态规划的解决呢?如何重复利用子问题的解呢?彷佛有些不那么直接。但其实也是于规律可循的。上面的递归式,是从字符串的两 边,想中间移动递归,根据动态规划解决问题的思想,咱们先解决子问题,再重复利用子问题,就是要从内向外解决,你们还记得回文子串判断的那个题目么,动态 规划解法的外层循环是子串的长度,这个题目也是相似的。示例代码以下:

http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5ODIzNDQ3Mw==&appmsgid=10000309&itemidx=1&sign=02c5c04f2410767cab1019cf64ebdc07

相关文章
相关标签/搜索