Loading

Leetcode每日一题 131.分割回文串

131. 分割回文串

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例:

输入: "aab"

 

输出:
[
  ["aa","b"],
  ["a","a","b"]
]

 

记忆化搜索保存所有回文串。

然后DFS搜索所有回文串的组合。

 

class Solution {
public:
    vector< vector<int> > f;
    vector< vector<string> > ret;
    vector< string > ans;
    int n ;
    void dfs(string s,int i)
    {
        if( i == n)
        {
            ret.push_back(ans);
            return;
        }

        for(int j = i ; j < n ; ++j)
        {
            if(f[i][j])
            {
                ans.push_back(s.substr(i,j-i+1));
                dfs(s,j+1);
                ans.pop_back();
            }
        }
    }

    vector<vector<string>> partition(string s) {
        n = s.size();
        f.assign(n,vector<int>(n,true));

        for(int i = n - 1 ; i >= 0 ; --i) //记忆化判断回文
            for(int j = i + 1 ; j < n ; ++j)
                f[i][j] = (s[i]==s[j])&&f[i+1][j-1];

        dfs(s,0);
        return ret;

    }
};

 

这题不熟,第一次遇见,看的题解默写了一遍,加深一下理解,这里记录一下,新知识点

标准判断dp判断回文模板(f[i][j]记录字符串区间i~j是否为回文串)

for(int i = n - 1 ; i >= 0 ; --i) 
            for(int j = i + 1 ; j < n ; ++j)
                f[i][j] = (s[i]==s[j])&&f[i+1][j-1];

大意就是找到s[i]与s[j] 判断它们两是否相等 并且 s[i+1 ~ j-1] 是否为回文串,满足两个条件,则s区间 (i~j)必定是回文串。

 

DFS则比较好理解,直接将字符串分割看成树状图。i是当前的分割点。

 

 

posted @ 2021-03-07 21:11  eveilcoo  阅读(87)  评论(0编辑  收藏  举报