[Leetcode] 131.回文-パーティショニング(バックトラック)[中]

リンク

https://leetcode-cn.com/problems/palindrome-partitioning/

時間がかかる

問題解決:24分
問題解決:35分

題名

文字列sが与えられた場合、各部分文字列が回文になるようにsをいくつかの部分文字列に分割します。

の可能なすべての分割スキームを返します。

アイデア

部分文字列の最初の文字が0の場合、回文が見つかるたびに、分割された配列に回文が追加され、元の文字列の最後にある部分文字列の次の位置が新しい文字列として使用されます(繰り返し)サブ問題)上記のプロセスを実行すると、サブストリングの次の位置が元のストリングの終わりである場合、分割された配列が結果に追加されます。バックトラックするときは、分割された配列から現​​在の回文文字列を削除します。

時間計算量:O(n 2 2 n)O(n ^ 22 ^ n)O n2 2n

ACコード

class Solution {
    
    
public:
    string s;
    vector<string> res;
    vector<vector<string>> ans;
    int len;
                
    bool IsPalindromeString(string s) {
    
    
        int n = s.size();
        for(int i = 0; i < n/2; ++i) {
    
    
            if(s[i] != s[n-1-i]) 
                return false;
        }
        return true;
    }               
                                        
    void dfs(int start_pos) {
    
    
        if(start_pos == len) {
    
    
            ans.push_back(res);
            return ;
        }
        for(int i = start_pos; i < len; ++i) {
    
    
            string tes_str = s.substr(start_pos, i-start_pos+1);
            if(IsPalindromeString(tes_str)) {
    
    
                res.push_back(tes_str);
                dfs(i+1);
                res.pop_back();
            }
        }
    }
                                        
    vector<vector<string>> partition(string s) {
    
    
        this->s = s;
        len = s.size();
        dfs(0);
        return ans;
    }
};

おすすめ

転載: blog.csdn.net/Krone_/article/details/114477833