Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: "babad" Output: "bab" Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd" Output: "bb"
题意:找出一个字符串中最长的回文串
思路:最高效的方法就是马拉车算法,不过这道题数据量比较小,直接枚举回文串的中心字符,以中心字符向两边扩展,知道向两边扩展的字符不相等,这里为了避免奇数和偶数两种情况的讨论,也利用到了马拉车的部分思想,给每两个连续的字符中间加一个特殊字符,首尾再加两个不一样的特殊字符。
Java代码:
public class Solution {
public String longestPalindrome(String s) {
if(s.equals("")) return "";
String ss,ans;
ss = ans = "";
int len = s.length();
ss += "~";
for(int i = 0; i < len; i++) {
ss += s.charAt(i);
ss += '$';
}
ss += '@';
int Max,_l,_r,l,r,cnt;
Max = _r = _l = 0;
//System.out.println(ss);
for(int i = 1; i < ss.length() - 1; i++) {
if(ss.charAt(i) != '$') cnt = 1;
else cnt = 0;
l = i - 1;
r = i + 1;
while(ss.charAt(l) == ss.charAt(r)) {
if(ss.charAt(l) != '$') cnt += 2;
l--;
r++;
//System.out.println(l + " " + r);
}
if(Max < cnt) {
Max = cnt;
_l = l + 1;
_r = r - 1;
}
}
for(int i = _l; i <= _r; i++) {
if(ss.charAt(i) != '$') {
ans += ss.charAt(i);
}
}
return ans;
}
}
C代码,返回字符串要用malloc来申请内存,传入的字符串可能为空,要特判一下,不然会RE。
char* longestPalindrome(char* s) {
if(strcmp(s,"") == 0) {
return "";
}
char ss[2015];
int len = strlen(s);
int Max = 0,i;
ss[0] = '~';
int cnt = 1;
for(i = 0; i < len; i++) {
ss[cnt++] = s[i];
ss[cnt++] = '$';
}
int left = 1,right = cnt - 2;
int al,ar;
char* ans = (char*) malloc(sizeof(char) * 1005);
for(i = left; i <= right; i++) {
if(ss[i] != '$') cnt = 1;
else cnt = 0;
int l = i - 1,r = i + 1;
while(l >= left && r <= right && ss[l] == ss[r]) {
if(ss[l] != '$') {
cnt += 2;
}
l--,r++;
}
if(Max < cnt) {
Max = cnt;
if(ss[l] != ss[r]) {
l++,r--;
}
al = l;
ar = r;
}
}
cnt = 0;
for(i = al; i <= ar; i++) {
if(ss[i] != '$') {
ans[cnt++] = ss[i];
}
}
ans[cnt++] = '\0';
return ans;
}