Longest Palindromic Substring

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

 

 1 public class Solution {

 2     String longestOne = null;

 3     int lengthOfLongest = 0;

 4     public String longestPalindrome(String s) {

 5         // Start typing your Java solution below

 6         // DO NOT write main() function

 7         longestOne = null;

 8         lengthOfLongest = 0;

 9         if(s.length() == 0){

10             return longestOne;

11         }

12         if(s.length() == 1){

13             return s;

14         }

15         for(int i = 0; i < s.length() - 1; i ++){

16             if(s.charAt(i) == s.charAt(i+1)){

17                 if((i == 0 || i == s.length() - 2) && lengthOfLongest < 2){

18                         lengthOfLongest = 2;

19                         longestOne = s.substring(i,i+2);

20                 }

21                 else{getLongestPalindrome(i - 1, i + 2, s);}

22             }

23         }

24         for(int i = 1; i < s.length() - 1; i ++){

25             getLongestPalindrome(i - 1, i + 1, s);

26         }

27         return longestOne;

28     }

29     

30     public void getLongestPalindrome(int left, int right, String s){

31         if(left < 0 || right >= s.length()) return;

32         int j = right;

33         for(int i = left; i > -1 ; i --){

34             if(j < s.length() && s.charAt(i) == s.charAt(j)){

35                 if(j-i+1 >= lengthOfLongest){

36                     lengthOfLongest = j-i+1;

37                     longestOne = s.substring(i,j+1);

38                 }

39             }

40             else{

41                 return;

42             }

43             j ++;

44         }

45     }

46 }

 第二遍:

 可以将长度为奇数的substring 和 偶数substring 归并到一起。 即使用两倍长度进行循环。 如果是点 则以为中心, 如果是中间,则以两边的点为中心。 减少很多test case。

 1 public class Solution {

 2     public String longestPalindrome(String s) {

 3         // Note: The Solution object is instantiated only once and is reused by each test case.

 4         String longestOne = null;

 5         int max = 0;

 6         int len = s.length();

 7         for(int i = 0; i <= (len - 1)* 2; i ++){

 8             int left = (i % 2 == 1 ? i / 2 : i / 2 - 1);

 9             int right = i / 2 + 1;

10             while(left > -1 && right < len && s.charAt(left) == s.charAt(right)){

11                 left --;

12                 right ++;

13             }

14             if(right - left - 1 > max){

15                 max = right - left - 1;

16                 longestOne = s.substring(left + 1, right);

17             }

18         }

19         return longestOne;

20     }

21 }

 第三遍:

 1 public class Solution {

 2     public String longestPalindrome(String s) {

 3         if(s == null || s.length() == 0) return null;

 4         int len = s.length();

 5         int max = 0;

 6         int max_left = 0, max_right = 0;

 7         for(int i = 0; i < len * 2 - 1; i ++){

 8             int left  = i / 2;

 9             int right = (i + 1) / 2;

10             while(left > -1 && right < len && s.charAt(left) == s.charAt(right)){

11                 left --;

12                 right ++;

13             }

14             if(right - left > max){

15                 max = right - left;

16                 max_left = left + 1;

17                 max_right = right;

18             }

19         }

20         return s.substring(max_left,max_right);

21     }

22 }

 

你可能感兴趣的:(substring)