zoukankan      html  css  js  c++  java
  • 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是当前的分割点。

  • 相关阅读:
    使用__autoload()来管理文件导入
    PHP 类中的常量
    PHP 访问类中的静态属性
    PHP 中的静态变量的简单使用
    Vscode下Python的用户界面介绍
    VsCode下代码导航
    在VS代码中编辑Python
    vscode下Python设置参考
    在VS Code中对Python进行单元测试
    解决html5中video标签无法播放mp4问题的办法
  • 原文地址:https://www.cnblogs.com/xiangqi/p/14496414.html
Copyright © 2011-2022 走看看