zoukankan      html  css  js  c++  java
  • 回文串 动态规划

    问题一:求一个字符串的最大回文字符串长度;

      1)思路:动态规划;

      2)具体描述:设立一个长度len为字符串str,用一个dp[len][len]的二维数组来表示字符串i-j下标所构成的子串的长度,经过循环计算之后我们返回最大回文子串的长度即可,即返回dp[0][len-1];

      3)dp数组的具体实现:根据动态规划自底向上的思想,从回文子串到求出整个最长回文字符串,首先从str的结尾开始遍历到str 的头部,同时每一次记录dp的初始值;如果str[i]==str[j],说明i-j为回文字符串,此时应该更新dp[i][j]的值;如果str[i]≠str[j],应该判断dp[i+1][j]和dp[i][j-1]的大小,取出其中max作为最大长度更新dp[i][j]的值

    static int longestPalindrome1(String str) {
            int len = str.length();
            for (int i = len - 1; i >= 0; i--) {
                dp[i][i] = 1;
                for (int j = i+1; j < len; j++) {
                    if(str[i] == str[j]) {
                        dp[i][j] = dp[i + 1][j - 1] +2;
                    } else {
                        dp[i][j] = max(dp[i+1][j], dp[i][j-1]);
                    }
                }
            }
            return dp[0][len-1];
        }
    

    还有一个题用了两个dp:
    https://leetcode-cn.com/problems/palindrome-partitioning-ii/submissions/

    这个题用dfs一直t,估计是要用动态规划:

    class Solution {
    public:
    vector<vector<int>> f;
        int n;
        int minx=1000000;
        
        int minCut(string s) {
            n=s.length();
            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]);
                }
            }
            vector<int> dp(s.size() + 1, 0);
            for (int i = 0; i < s.size(); i++) dp[i] = i;
    
            for (int i = 1; i < s.size(); i++) {
                if (f[0][i]) {
                    dp[i] = 0;
                    continue;
                }
                for (int j = 0; j < i; j++) {
                    if (f[j + 1][i]) {
                        dp[i] = min(dp[i], dp[j] + 1);
                    }
                }
            }
            return dp[s.size() - 1];
    
    
        }
    };
    

    感谢这篇题解:https://leetcode-cn.com/problems/palindrome-partitioning-ii/solution/132-fen-ge-hui-wen-chuan-iidong-tai-gui-6fyn1/

    为了自己,和那些爱你的人
  • 相关阅读:
    前端js部分面试题
    前端css部分面试笔试题
    javascript 面向对象
    string 对象
    JavaScript 正则表达式
    JavaScirpt 位运算
    JavaScript冒泡循环排序案例
    JavaScript 练习题
    浏览器缓存机制
    浏览器对象模型(BOM)
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/14493764.html
Copyright © 2011-2022 走看看