zoukankan      html  css  js  c++  java
  • leetcode longest palindromic substring (medium) /java

    最长回文字串

    上题:

    测试用例中,注意aaabaaaa。

    但是我time limit exceeded。用了极暴力的方法解。(三层循环)找每一个字符的最长回文字串。

     1 /**
     2 * 最长回文子串
     3 * 2017-5-7
     4 **/
     5 
     6 import java.io.*;
     7 import java.util.*;
     8 import java.lang.*;
     9 
    10 public class Solution
    11 {
    12     public static String longestPalindrome(String s)
    13     {
    14         int len=s.length();
    15         char[] c=s.toCharArray();
    16         String str=new String("hz");
    17         int max=0;
    18         int from=0,to=0;
    19         int i,j,ii,jj;
    20         for(i=0;i<len-1;i++)
    21         {
    22             ii=i;
    23             for(j=len-1;j>0;j--)
    24             {
    25                 jj=j;
    26                 while(c[i]==c[j]&&i<j-1)
    27                 {
    28                     i++;j--;
    29                 }
    30                 //System.out.println("i:"+i+"--j:"+j);
    31                 if(((i==j||(i+1==j&&(c[i]==c[j])))&&jj-ii>max))
    32                 {
    33                     max=jj-ii;
    34                     from=ii;
    35                     to=jj;
    36                     //System.out.println(max+" -- "+ii+" -- "+jj);
    37                 }
    38                 i=ii;
    39                 j=jj;
    40 
    41             }
    42         }
    43         //System.out.println(from+" -- "+to);
    44         str=s.substring(from,to+1);
    45         return str;
    46 
    47     }
    48     public static void main(String[] args)
    49     {
    50 
    51         System.out.println(longestPalindrome("aaabaaaa"));
    52     }
    53 
    54 }
    View Code

    挂在超级长的用例上了。

    决定用动态规划。

    【待更新】

    更新:

     1 int len=s.length();
     2         char[] c=s.toCharArray();
     3         String str=new String("hz");
     4         int max=0;
     5         int from=0,to=0;
     6         int i,j,ii,jj;
     7         for(i=0;i<len-1;i++)
     8         {
     9             /*
    10             if(c[i]==c[i+1])
    11             {
    12                 ii=i;
    13                 jj=i+1;
    14             }
    15             else
    16             {
    17                 ii=i;
    18                 jj=i;
    19             }*/
    20             ii=i;
    21             jj=i+1;
    22             while((c[ii]==c[jj])&&(ii>0)&&(jj<len-1))
    23             {
    24                 ii--;
    25                 jj++;
    26             }
    27             if(c[ii]==c[jj])
    28             {
    29                 ;
    30             }
    31             else
    32             {
    33                 ii++;
    34                 jj--;
    35             }
    36 
    37             if(jj-ii>max)
    38             {
    39                 max=jj-ii;
    40                 from=ii;
    41                 to=jj;
    42             }
    43 
    44         }
    View Code

    这是我改进后的代码。

    发现ttaaatt测试用例输出时tt。恍然明白在if语句的时候它无法精准判断回文子串的奇偶性。

    于是我奇偶都来一遍。

      1 /**
      2 * 最长回文子串
      3 * 2017-5-7
      4 **/
      5 
      6 import java.io.*;
      7 import java.util.*;
      8 import java.lang.*;
      9 
     10 public class Solution
     11 {
     12     public static String longestPalindrome(String s)
     13     {
     14         int len=s.length();
     15         char[] c=s.toCharArray();
     16         String str=new String("hz");
     17         int max=0;
     18         int from=0,to=0;
     19         int i,j,ii,jj;
     20         for(i=0;i<len-1;i++)
     21         {
     22             /*
     23             if(c[i]==c[i+1])
     24             {
     25                 ii=i;
     26                 jj=i+1;
     27             }
     28             else
     29             {
     30                 ii=i;
     31                 jj=i;
     32             }*/
     33             ii=i;
     34             jj=i+1;
     35             while((c[ii]==c[jj])&&(ii>0)&&(jj<len-1))
     36             {
     37                 ii--;
     38                 jj++;
     39             }
     40             if(c[ii]==c[jj])
     41             {
     42                 ;
     43             }
     44             else
     45             {
     46                 ii++;
     47                 jj--;
     48             }
     49 
     50             if(jj-ii>max)
     51             {
     52                 max=jj-ii;
     53                 from=ii;
     54                 to=jj;
     55             }
     56 
     57         }
     58         for(i=0;i<len-1;i++)
     59         {
     60             /*
     61             if(c[i]==c[i+1])
     62             {
     63                 ii=i;
     64                 jj=i+1;
     65             }
     66             else
     67             {
     68                 ii=i;
     69                 jj=i;
     70             }*/
     71             ii=i;
     72             jj=i;
     73             while((c[ii]==c[jj])&&(ii>0)&&(jj<len-1))
     74             {
     75                 ii--;
     76                 jj++;
     77             }
     78             if(c[ii]==c[jj])
     79             {
     80                 ;
     81             }
     82             else
     83             {
     84                 ii++;
     85                 jj--;
     86             }
     87 
     88             if(jj-ii>max)
     89             {
     90                 max=jj-ii;
     91                 from=ii;
     92                 to=jj;
     93             }
     94 
     95         }
     96         //System.out.println(from+" -- "+to);
     97         str=s.substring(from,to+1);
     98         return str;
     99 
    100     }
    101     public static void main(String[] args)
    102     {
    103 
    104         while(true)
    105         {
    106             Scanner input=new Scanner(System.in);
    107             String s=input.nextLine();
    108             System.out.println(longestPalindrome(s));
    109         }
    110 
    111     }
    112 
    113 }
    View Code

    accepted。【2017-5-7】

    虽然显得无比愚蠢==但是我也很绝望啊。

    感觉还可以完善。

    【待更新】

  • 相关阅读:
    提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
    五维偏序模板(bitset+分块)
    【BZOJ5328】【SDOI2018】—物理实验(扫描线+双指针)
    【VIOLET3】【BZOJ2716】天使玩偶(cdq分治)
    【BZOJ3295】【CQOI2011】—动态逆序对(cdq分治)
    【BZOJ1492】【NOI2007】—Cash(cdq分治维护凸包优化斜率dp)
    【BJOI2018】【BZOJ2591】—链上二次求和(线段树维护二次函数)
    【COGS2479】【HZOI2016】偏序(cdq套cdq)
    【BZOJ5293】【BJOI2018】—求和
    【BZOJ4009】【HNOI2015】—接水果(整体二分+扫描线)
  • 原文地址:https://www.cnblogs.com/zhenzhenhuang/p/6820864.html
Copyright © 2011-2022 走看看