【问题标题】:Reverse substring to get a palindrome反向子串得到回文
【发布时间】:2025-12-26 21:00:07
【问题描述】:

给定一个由英文字母中的小写字符组成的字符串,我们希望从字符串中反转一个子字符串,使该字符串成为回文。

注意:回文是一个字符串,等于它的倒数。

我们需要判断是否存在一些子字符串,可以将其反转以将字符串转换为回文。

示例: 让字符串为“zakdakdz”。那么这个字符串的答案是肯定的,因为我们可以反转索引 4 和 6 之间的字符串来得到 zakddkaz

基本方法: 尝试反转每个子字符串并检查我们是否得到回文。但是,对于长字符串来说,这是一种不好的方法。

那么有没有更好的办法解决呢?

有没有比 O(N^2) 更快的方法?

【问题讨论】:

  • 是的,当然有。他们可能正在考虑从头到尾遍历字符串,然后比较字符。
  • @JerryCoffin 它是什么?
  • @JerryCoffin “他们在想”是什么意思?
  • 我的意思是“分配这个作业的人可能希望你以这种方式完成作业。”
  • 这是 Codechef.com (codechef.com/TCFS15P/problems/PALINREV) 现场比赛的问题。

标签: string algorithm substring palindrome


【解决方案1】:

这是一个二次时间算法,从三次算法(我强烈怀疑进一步改进到线性时间或 n log n 是可能的)。假设字符串如下所示:

X...X .

我声称,如果存在一个子字符串,其反转使该字符串成为回文,那么存在这样的子字符串不包括X。这种效果的 case 参数是,如果它同时包含Xs,那么字符串已经是回文。如果它只包含一个X,通过对称说第一个,那么子字符串必须看起来像

X...X...X ,
^^^^^

因为第二个X 不动。我们可以将反转的子字符串缩小为

X...X...X .
 ^^^

二次时间算法是从末端扫描直到我们发现不匹配。然后尝试所有以左侧不匹配字母开头的子字符串和所有以右侧不匹配字母结尾的子字符串。

【讨论】:

  • 你能提供一些伪代码吗?它会让事情更清楚
【解决方案2】:

长度小于 2 的字符串是回文,并且每个子字符串都保持如此反转。如果我不那么懒惰,我可能会
从两端向内扫描较长的字符串以查找字符(或在中间相遇)的差异,然后从中间向外扫描。知道非回文区域,如果它们相同,则反转一个将把整个字符串变成回文。

【讨论】:

  • 你能提供一些伪代码吗?还要记住我们只能反转单个字符串
  • @cook topcoder:我正要严厉回答。 rememberwe 敲响了更多的“任务钟声”:描述应用程序,如果它既不是任务也不是竞赛,或者预先说明它是什么,请帮助以支持解决方案。 “zakdakdz”:从外到内,你会发现 'a'(左起 1)和 'd'(左起 6(右起 1))不同,从里到外,'d'(3) 和 'a' (4)。如果 1-3 和 4-6(含)的子串不同,则没有一个反转会产生回文,因为它们相等,请选择一个反转。
  • 我想你没有得到问题