题目表述
给你一个字符串 s,找到 s 中最长的回文子串。
示例
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
先上代码
public class Solution5 {
public static void main(String[] args) {
System.out.println(longestPalindrome("ccccc"));
}
public static String longestPalindrome(String s) {
int len = s.length();
if(len<2){
return s;
}
int maxLen = 1;
int begin = 0;
char[] chars = s.toCharArray();
for(int i = 0;i<len -1;i++){
for (int j = i+1;j<len;j++){
if(j-i+1>maxLen &&isTrue(chars,i,j) ){
maxLen = j -i +1;
begin = i;
}
}
}
return s.substring(begin,begin+maxLen);
}
public static boolean isTrue(char[] chars,int left,int right){
while (left<right){
if(chars[left] != chars[right]){
return false;
}
left++;
right--;
}
return true;
}
}
分析:
寻找最长回文子串,可以采用暴力的手法去解决。
先考虑字符长度很小的情况,当输入的字符串的长度小于2的时候,直接返回字符串本身。
当字符串的长度大于1的时候,需要对其扫描遍历求解。
定义扫描的范围 i 和 j。i从起始位置开始,到最后一个位置的前一位结束,j从i的下一位到字符串结尾结束(要保证扫描的长度要大于1)。
关键理解的地方: 我们在寻找和截取字符串的时候,可以记录其起始位置和长度,就可以直接拿到那个子字符串。
所以我们预先定义长度为1,起始位置为0。
- 先用字符串的toCharArray()方法转化为字符数组,方便遍历扫描。
- 然后就是两个for循环扫描。最里面需要判断当前扫描到的字符串是否为回文子串,并且目前扫描到的长度是否大于maxLen里面保存的值。如果成立,就对maxLen进行更新,保存回文子串的开始位置。( 我们在寻找和截取字符串的时候,可以记录其起始位置和长度,就可以直接拿到那个子字符串。)
- 写一个判断是否为回文子串的函数,参数为之前转换的字符数组,传入进行判断的起始位置。然后从两端向中间扫描比较,如果出现不等的情况,就直接返回false,否则,两端同时向中间移动继续比较。
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/