(字符串操作)LeetCode#5. Longest Palindromic Substring

来源:互联网 发布:java replace函数 正则 编辑:程序博客网 时间:2024/06/03 09:34
  • 题目: 求字符串的最长回文子串
  • 难度: Medium
  • 思路: 遍历字符串,以每个元素为回文中心,向两边扩展找相同元素
  • 代码:
    方法一:
public class Solution {    public String longestPalindrome(String s) {       //思路:定义两个变量maxLen和start来存储最长回文长度以及起始位置       int len = s.length();       if(s == null || len == 1 || len == 0){           return s;       }       int maxLen = 0;       int start = 0;       for(int i = 0; i < len;){           if(len-i <= maxLen/2){               break;           }           //left和right始终指向子串的起始和结束位置           int left = i;           int right = i;           while(right < len-1 && s.charAt(right+1) == s.charAt(right)){               right++;           }           i = right+1;//下次一个驼着的起始位置           while(left > 0 && right < len-1 && s.charAt(left-1) == s.charAt(right+1)){               left--;               right++;           }           if(right-left+1 > maxLen){               maxLen = right-left+1;               start = left;           }       }       return s.substring(start,start+maxLen);    }}

方法二:

public class Solution {    public String longestPalindrome(String s) {       //思路:定义两个变量maxLen和start来存储最长回文长度以及起始位置       int len = s.length();       if(s == null || len == 1 || len == 0){           return s;       }       int maxLen = 0;       String result = "";       for(int i = 0; i < len; i++){           int left = 0;           int right = 0;           //第一种情况:以第i个元素为中心,向两侧寻找相同元素           left = i-1;            right = i+1;           while(left >=0 && right <= len-1){               if(s.charAt(left) == s.charAt(right)){                   left--;                   right++;               }else{                   break;               }//当s.charAt(left) != s.charAt(right)时,一定要break,否则就会出现死循环           }           //或者上面的while循环写成            //while(left >= 0 && right <= len-1 && s.charAt(left) == s.charAt(right)){            //  left--;            //   right++;           //}           if(right-left-1 > maxLen){               maxLen = right-left-1;               result = s.substring(left+1,right);           }           //第二种情况:以第i和第i+1为中心           left = i;           right = i+1;           while(left >= 0 && right <= len-1){               if(s.charAt(left) == s.charAt(right)){                   left--;                   right++;               }else{                   break;               }           }           if(right-left-1 > maxLen){               maxLen = right-left-1;               result = s.substring(left+1,right);           }       }       return result;    }}