个人解法是以每一个字符为中心进行两侧试探,或者以每两个相邻字符为中心进行两侧试探数组
public class Solution { public String longestPalindrome(String s) { int maxI = -1; int maxLengthI = 0; int maxJ = -1; int maxLengthJ = 0; for (int i = 0; i < s.length(); i++) { int p = i; int q = i; while (p >=0 && q < s.length()) { if (s.charAt(p) == s.charAt(q)) { p--; q++; } else { break; } } if ((q-p-1) > maxLengthI) { maxLengthI = q-p-1; maxI = i; } } for (int j = 0; j< s.length()-1; j++) { int p = j; int q = j+1; while (p >=0 && q < s.length()) { if (s.charAt(p) == s.charAt(q)) { p--; q++; } else { break; } } if ((q-p-1) > maxLengthJ) { maxLengthJ = q-p-1; maxJ = j; } } if (maxLengthI > maxLengthJ) { return s.substring(maxI - maxLengthI/2, maxI+maxLengthI/2+1); } else { return s.substring(maxJ - maxLengthJ/2+1, maxJ+maxLengthJ/2+1); } } }
正统的方法还有动态规划,动态规划,相似于lcs的解法,数组flagi记录s从i到j是否是回文code
首先初始化,i>=j时,flagi=true,这是由于si是单字符的回文,当i>j时,为true,是由于有可能出现flag2这种状况,好比bcaa,当计算s从2到3的时候,s[2]==s[3],这时就要计算s[2+1] ?= s[3-1],总的来讲,当i>j时置为true,就是为了考虑j=i+1这种状况。string
接着比较s[i] ?= s[j],若是成立,那么flagi = flagi+1,不然直接flagi=falseio
class Solution { public: string longestPalindrome(string s) { int len = s.length(), max = 1, ss = 0, tt = 0; bool flag[len][len]; for (int i = 0; i < len; i++) for (int j = 0; j < len; j++) if (i >= j) flag[i][j] = true; else flag[i][j] = false; for (int j = 1; j < len; j++) for (int i = 0; i < j; i++) { if (s[i] == s[j]) { flag[i][j] = flag[i+1][j-1]; if (flag[i][j] == true && j - i + 1 > max) { max = j - i + 1; ss = i; tt = j; } } else flag[i][j] = false; } return s.substr(ss, max); } };