題目連結
github 解題連結 解法1
github 解題連結 解法2
** 解法2的表格爆炸了,有興趣的可以點我的github來了解**
從s裡找到最長的對稱字串
DP string
class Solution {
public:
    pair<int, int> expandAroundCenter(string s, int left, int right) {
        while (left >= 0 && right < s.size() && s[left] == s[right]) {
            left--;
            right++;
        }
        return {left + 1, right - 1};
    }
    string longestPalindrome(string s) {
        int start = 0, end = 0;
        
        for (int i = 0; i < s.size(); i++) {
            auto [left1, right1] = expandAroundCenter(s, i, i);
            auto [left2, right2] = expandAroundCenter(s, i, i + 1);
            if (right1 - left1 > end - start) {
                start = left1;
                end = right1;
            }
            if (right2 - left2 > end - start) {
                start = left2;
                end = right2;
            }
        }
        return s.substr(start, end - start + 1);
    }
};
根據題意,而且標籤有dp,基本可以先建表
| b | a | b | a | b | a | |
|---|---|---|---|---|---|---|
| b | ||||||
| a | ||||||
| b | ||||||
| a | ||||||
| b | ||||||
| a | 
| b | a | b | a | b | a | |
|---|---|---|---|---|---|---|
| b | b | ba | bab | baba | babab | bababa | 
| a | / | a | ab | aba | abab | ababa | 
| b | / | / | b | ba | bab | baba | 
| a | / | / | / | a | ab | aba | 
| b | / | / | / | / | b | ba | 
| a | / | / | / | / | / | a | 
我們只要判斷這格是不是對稱的就行了,也就是==>判斷頭與尾是否相同
相同: 去看減去頭與尾的字串是否對稱
不同: 會報這格是非對稱(這樣下次有相同的頭尾時查找這格時就可以直接給答案

class Solution {
    public String longestPalindrome(String s) {
        String ans = "";
        int n = s.length();
        ans+=s.charAt(0);
        boolean[][] dp = new boolean[n][n];
        for(int i = 0;i < n;i++) dp[i][i] = true;
        //size is 2
        for(int i = 0;i < n;i++){
            if(i + 1 < n && s.charAt(i) == (s.charAt(i+1))){
                dp[i][i+1] = true;
                if(ans.length() < 2) ans = s.substring(i,i+2);
            }
        }
        // size > 2
        // len + start < n
        for(int len = 2;len<n;len++){
            for(int start = 0;len + start < n;start++){
                int end = start + len;
                if(s.charAt(start) == (s.charAt(end)) && dp[start+1][end-1]){
                    dp[start][end] = true;
                    
                    String temp = s.substring(start,end+1);
                    ans = temp.length() > ans.length() ? (temp): (ans); 
                }
            }
        }
        return ans;
    }
}