给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
这个普遍是使用动态规划,但是都是遍历全部N*N次不断累加后取最后一个数字。
我觉得没有必要全部遍历,于是研究了一下。
1.我们来看一下,这个字符串按照动态规划生成的数组:
回文的坐标点连线按照次对角线轴对称
我们发现,按照动态规划生成数组,找到的最长回文序列:“04566540”对应i,j的连线,其实是按照次对角线轴对称的,那么是否可以不遍历全部,只遍历对角线左上方呢?答案是肯定的!
那么只需要找出前一半的长度,乘以二不就是我们要的结果了?可是有一个问题啊,让我们看一下下面的情况:
这种情况如何处理?如果判断经过对角线就+1?不不不,这个判断太麻烦,我使用了0.5/0两个数处理,一会代码中可以体现出来。
刚刚说到只遍历一半,那也还是n方啊,没有什么实质性的改变。接下来我想到一个新的点子:我发现其实从一个点所在的“层”到对角线的增量的最大值,是一个固定的值!那么,这个发现有什么用呢??还是通过一个图来看一下:
啊对了,首先要介绍一下这里“层”的概念,其实很简单,就是平行于次对角线的线,从左上角往右下方看:第一层就是一个0,第二层是0 0,那么最后一层就是对角线啦,很显然每一层上的 i + j 都是相等的。
那么我