最长回文子串 : Marcher算法

相应leetcode题目

leetcode 第5题. 最长回文子串
tu1

1.回文串

即从两边开始到中间,对应的字符都相同

public boolean isPalindrome(String str){
   
      int i=0,j=str.length();
      while (i<j){
   
          if(str.charAt(i++)!=str.charAt(j++)){
   
              return false;
          }
      }
      return true;
}

从leetcode 第5题的示例输出: “bab” 和 “bb” , 回文串的长度有奇偶之别 ,长度为偶数的回文串不能从其本身的字符来确定中心对称点 ,因此可以添加辅助字符来帮助确定中心对称的字符: ( 添加的辅助字符必须是回文串中未曾出现过的字符)

假设对于只用26个小写字母构成的字符串而言 ,则可以用一些标点符号来充当辅助字符 ,比如 ‘#’ 。 那么对于题中示例长度为偶数的回文串 ,添加辅助字符后可以形成 " #b#b# " ,该字符串则以 ‘#’ 成中心对称 。

对与长度为奇数的回文串 ,尝试添加同样的辅助字符 ,同样也不影响其对称的特点 ,如 " #b#a#b# "。 因此可以不管字符串的长度 ,都添加辅助字符来帮助确定回文串的中心 。

2.寻找字符串中的回文子串

上面通过添加辅助字符可以确定回文串的对称中心 ,同样 ,对于寻找字符串中的回文子串 ,也可以添加辅助字符来帮助寻找 。

既然回文串关于中心对称 ,那可以用中心扩散法( 以某一个字符为中心 ,从中间向两边 ,匹配两边的每一个字符 )在字符串中找回文子串 ,即遍历字符串中的每个字符 ,在遍历的过程中 ,以每个字符为中心向两边扩散 ,寻找回文子串 。

如 ,在 " cabafabae " 中寻找回文子串 ,先添加辅助字符形成 "#c#a#b#a#f#a#b#a#e " ,然后遍历该字符串的每个字符 ,并在遍历的过程中 ,以每个字符为中心向两边扩散 。

在扩散的过程中 ,比如在遍历字符串 " #c#a#b#a#f#a#b#a#e " 到字符 ‘f’ 的时候 ,已经可以确定的回文子串有 ” #a#b#a#f#a#b#a# “ 和 ” #a#b#a# “ 等等,那么在接下来继续遍历右边字符 ’b‘ 的时候 ,可以根据回文串对称的特点,确定字符 ’f‘ 右边的也有一个关于以 ’b‘ 字符为中心的回文子串 ” #a#b#a#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值