领扣笔记
题目:最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
我自己想到的只有暴力解法,很容易就写出来,果然超时了,我自己拿到IDE中调试了下,不考虑时间的话还是能跑通的哈哈哈。代码如下:
class Solution {
public String longestPalindrome(String s) {
/*************暴力弟弟算法*************/
if (s == null || s == "") return s;
String res = new String();
for (int i = 0; i < s.length(); i++) {
for (int j = i + 1; j <= s.length(); j++) {
if (isPalindrome(s.substring(i, j))) {
res = s.substring(i, j).length() > res.length()? s.substring(i, j):res;
}
}
}
return res;
}
private boolean isPalindrome(String s) {
int i = 0, j = s.length() - 1;
while (i < j) {
if (s.charAt(i) == s.charAt(j)) {
i++;
j--;
}
else return false;
}
return true;
}
}
然后去搜了别人家的算法,真的是赏心悦目啊,在这里做个笔记,原作者我不知道了,抱歉抱歉。
class Solution {
public String longestPalindrome(String s) {
if (s.isEmpty() || s.length() == 1) return s;
String longest = s.substring(0, 1);
for (int i = 0; i < s.length(); i++) {
//以当前i为中心的奇数长度最长回文子串
String tmp = findLongest(s, i, i);
//是否需要更新最长
if (tmp.length() > longest.length()) {
longest = tmp;
}
//以当前i为中心的偶数长度最长回文子串
tmp = findLongest(s, i, i+1);
//是否需要更新最长
if (tmp.length() > longest.length()) {
longest = tmp;
}
}
return longest;
}
private String findLongest(String s, int begin, int end) {
//以begin为中心的最长子串,一趟扫描就可以判断出来
while (begin >= 0 && end <= s.length( ) - 1 && s.charAt(begin) == s.charAt(end)) {
begin--;
end++;
}
String tmp = s.substring(begin + 1, end);
return tmp;
}
}
路漫漫其修远兮,共勉。