原题
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
大黄有故事 2016-12-15 1353浏览量
简介: 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。 输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子:
abcda
输出例子:
2
2
回文串中。最后一次出现的位置。必定对应镜像的位置。
后续遍历字符串。标记每个字符第一次出现的位置,遍历到两次的字符,就标记其第二次出现的位置。如果这个字符没有前后对应位置,就标记其自己的位置。
样例abababa
对于str[6] a来说,倒叙遍历中,a第一次出现。对应从正序第一次出现再下标0
对于str[4] a来说,倒叙遍历中,a第二次出现。对应从正序第二次出现再下标2
对于str[3] b来说,倒叙遍历中,b第三次出现。对应从正序第三次出现再下标3
对于str[2] a来说,倒叙遍历中,a第三次出现。对应从正序中已经没有再出现的位置。标记为2本身
这番操作得到一个数组,对于这个数组。如果回文串是正常的回文串。其下标值,应该是以中心为对称的严格递增递减。
但是对于本题中,中间可能出现无关字符的,举例如下
样例a1b2a1b2a3b4a
对于这个数组来讲。按照回文串先递增再递减的规律
可以根据数组直接找出源数据中的回文串。
例如,
a1b1a,数组中下标01210
abaaba,数组中下标024420
目标串abababa,数组中下标0246420
数组获取过程优化。
如果倒叙遍历字符,首次出现就从下标0到其本身下标中查询。
第二次出现,就从第一次出现的位置到其本身中查询,
。。。