给定一个由英文字母表中的小写字符组成的字符串,我们想要从字符串中反转一个子字符串,使字符串成为回文结构。
注意: Palindrome是一个等于其反向的字符串。
我们需要判断是否存在可以反转的子字符串以将字符串转换为回文结构。
示例:让字符串为" zakdakdz"。那么这个字符串的答案是肯定的,因为我们可以在索引4和6之间反转字符串以获得zakddkaz
基本方法:尝试反转每个子字符串并检查是否得到了回文。但是,这对于长字符串来说是不好的方法。
那么有更好的解决方法吗?
可以比O(N ^ 2)方法快吗?
答案 0 :(得分:1)
这是一个二次时间算法,从立方体(我强烈怀疑进一步改进,到线性时间或可能是n log n)是可能的。假设字符串如下所示:
X...X .
我声称,如果存在一个子串,其反转使得该字符串成为回文,那么就存在不包含X
的子字符串。这种效果的案例论证是,如果它包含两个X
s,那么该字符串已经是回文。如果它只包含一个X
,比如说第一个是对称的,那么子字符串必须看起来像
X...X...X ,
^^^^^
因为第二个X
不为所动。我们可以将反转的子串缩小为
X...X...X .
^^^
二次时间算法是从末端扫描直到我们发现不匹配。然后尝试从左边不匹配的字母开始的所有子字符串以及以正确的不匹配字母结尾的所有子字符串。
答案 1 :(得分:0)
长度低于2的字符串是回文,并且保持如此反转每个子字符串。如果我不那么懒,我可能会 从两端向内扫描较长的弦,以获得不同的角色(或在中间相遇),然后从中间向外扫描。知道了非回文区域,如果它们是相同的话,那么一个反转就会把整个字符串变成回文。