String 用最早切分法将字符串拆分为三个回文的最优解

String 用最早切分法将字符串拆分为三个回文的最优解,string,palindrome,String,Palindrome,我在一次采访中被问到这个问题: 给定一个字符串(1仍然是O(n^2)解,但您可以将回文子字符串的结果存储在一个表中,并使用该结果获得答案 vector<string> threePalindromicSubstrings(string word) { int n = word.size(); vector<vector<bool>> dp (n,vector<bool>(n,false)); for(int i = 0 ;

我在一次采访中被问到这个问题:

给定一个字符串(1仍然是O(n^2)解,但您可以将回文子字符串的结果存储在一个表中,并使用该结果获得答案

vector<string> threePalindromicSubstrings(string word) {
    int n = word.size();
    vector<vector<bool>> dp (n,vector<bool>(n,false));
    for(int i = 0 ; i < n ; ++i)
        dp[i][i] = 1;
    
    for(int l = 2 ; l <= n ; ++l){
        for(int i = 0 ; i < n - l +1 ; ++i){
            int j = i + l - 1;
            if(l == 2)
                dp[i][j] = (word[i] == word[j]);
            else
                dp[i][j] = (word[i] == word[j]) && (dp[i+1][j-1]);
        }
    }

    vector<string> ans;
    for(int i = 0 ; i < n - 2 ; ++i){
        if(dp[0][i]) {
            for(int j = i+1 ; j < n - 1 ; ++j){
                if(dp[i+1][j] && dp[j+1][n-1]){
                    ans.push_back(word.substr(0,i + 1));
                    ans.push_back(word.substr(i+1,j-i));
                    ans.push_back(word.substr(j+1,n-j));
                    return ans;
                }
            }
        }
    }
    if(ans.empty())
        ans.push_back("Impossible");
    return ans;
}
向量三回文子字符串(字符串字){
int n=word.size();
向量dp(n,向量(n,假));
对于(int i=0;ivector<string> threePalindromicSubstrings(string word) {
    int n = word.size();
    vector<vector<bool>> dp (n,vector<bool>(n,false));
    for(int i = 0 ; i < n ; ++i)
        dp[i][i] = 1;
    
    for(int l = 2 ; l <= n ; ++l){
        for(int i = 0 ; i < n - l +1 ; ++i){
            int j = i + l - 1;
            if(l == 2)
                dp[i][j] = (word[i] == word[j]);
            else
                dp[i][j] = (word[i] == word[j]) && (dp[i+1][j-1]);
        }
    }

    vector<string> ans;
    for(int i = 0 ; i < n - 2 ; ++i){
        if(dp[0][i]) {
            for(int j = i+1 ; j < n - 1 ; ++j){
                if(dp[i+1][j] && dp[j+1][n-1]){
                    ans.push_back(word.substr(0,i + 1));
                    ans.push_back(word.substr(i+1,j-i));
                    ans.push_back(word.substr(j+1,n-j));
                    return ans;
                }
            }
        }
    }
    if(ans.empty())
        ans.push_back("Impossible");
    return ans;
}