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】

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

感觉还可以完善。

【待更新】

 

posted @ 2017-05-07 15:02  天气晚来秋  阅读(141)  评论(0编辑  收藏  举报