Python和Java解题:最长回文子串

  

  

  

给定一个字符串年代,找到年代中最长的回文子串。你可以假设年代的最大长度为1000 .

  

  

  <前>   <代码>   
//输入:      
  
//输出:      
  
//注意:   也是一个有效答案。   
  
  

  

  <前>   <代码>   
//输入:      
  
//输出:      
  
  

  

  

  

  

由于回文字符串的对称性,所以每次可以选择一个数字作为中心,进行左右拓展来判断是否是回文串。

  

由于字符串有可能为奇数,有可能为偶数,所以需要从1或2个字符之间开始拓展。

  

意思就是我有+ - 1个拓展中心。

  

则我为奇数位,

  

i + 1为偶数位。

  

以此为理论依据每次循环往两边拓展即可。

  

此解法时间复杂度是O (n ^ 2)。

  

空间复杂度是O (1)。

  

  

  

第一次接触这个算法,但是想出这个算法的人,确实牛逼。

  

马拉车算法将时间复杂度提升到了线性。

  

此算法最初遍历字符,在每个字符两边都插入一个特殊符号,为避免越界,首尾加上特殊标签,例如:

  

aabbcbbaa→^ # # # # # c# b # b # # # $

  

保证当前字符串一定为奇数。

  

然后左右扩展。

  

利用一个长度为原字符串长度的数的arr组来保存中心扩展的最大个数。

  

(arr每个元素的下标——arr[我])/2就是原字符串的字符的下标。

  

我们设C为字符串中心,R为字符串右边的长度,则有R=C + arr[我].

  

这时候就可以用中心扩展法去求。

  

我们用j表示我第个字符与C对应的下标。

  

但有以下三种情况会导致arr [j]不正确

  
      <李>长度超出了R   <李> arr [j]到了原字符串的左边界李   <李>当我就是为R时李
  

所以遇到以上三种情况,我们需要利用中心拓展法去做边界处理。

      Python和Java解题:最长回文子串”>
  
  <p>
  </p>
  <前>
  <代码>
  <br/>
  
  <br/>
  <br/>
  ,str
  <br/>
  <br/>
  ,左
  <br/>
  <br/>
  ,对吧
  <br/>
  <br/>
  
  <br/>
  <br/>
  
  <br/>
  <br/>
  ,expandCenter=)=比;{
  <br/>
  <br/>
  (左祝辞=,,正确的& lt;str.length,,str(左)===str[右]){
  <br/>
  <br/>——离开
  <br/>
  <br/> + +
  <br/>
  <br/>}
  <br/>
  <br/>
  str。片(左+
  ,对吧)
  <br/>
  <br/>}
  <br/>
  <br/>
  
  <br/>
  <br/>
  ,年代
  <br/>
  <br/>
  
  <br/>
  <br/>
  
  <br/>
  <br/>
  ,longestPalindrome1=)=比;{
  <br/>
  <br/>
  (!年代| | ! s.length) {
  <br/>
  <br/>
  ,
  
  <br/>
  <br/>}
  <br/>
  <br/>
  ,结果=<br/>
  <br/>
  (
  ,我=;我& lt;s.length;我+ +){
  <br/>
  <br/>
  奇怪,=expandCenter(年代,我)
  <br/>
  <br/>
  ,甚至=expandCenter(年代,我+
  )
  <br/>
  <br/>
  (奇数。长度比;result.length) {
  <br/>
  <br/>=奇怪的结果
  <br/>
  <br/>}
  <br/>
  <br/>
  (甚至。长度比;result.length) {
  <br/>
  <br/>=甚至结果
  <br/>
  <br/>}
  <br/>
  <br/>}
  <br/>
  <br/>
  ,结果
  <br/>
  <br/>}
  <br/>
  <br/>,
  <br/>
  <br/>
  
  <br/>
  <br/>
  ,年代
  <br/>
  <br/>
  
  <br/>
  <br/>
  
  <br/>
  <br/>
  ,setTarget=)=比;{
  <br/>
  <br/>
  (年代){
  <br/>
  <br/>
  ,
  
  <br/>
  <br/>}
  <br/>
  <br/>
  (s。长度===) {
  <br/>
  <br/>
  ,
  
  <br/>
  <br/>}
  <br/>
  <br/>
  ,res=<br/>
  <br/>
  (
  ,我=,len=s.length;我& lt;兰;+ + i) {
  <br/>
  <br/> res=res +
  + s.charAt(我)
  <br/>
  <br/>}
  <br/>
  <br/> res +=<br/>
  <br/>
  ,res
  <br/>
  <br/>}
  <br/>
  <br/>,
  <br/>
  <br/>
  
  <br/>
  <br/>
  ,年代
  <br/>
  <br/>
  
  <br/>
  <br/>
  
  <br/>
  <h2 class=Python和Java解题:最长回文子串