动态规划-字符串

题目列表

    • 32. 最长有效括号
    • 10. 正则表达式匹配

32. 最长有效括号

题目链接
代码

class Solution {
public:
    int longestValidParentheses(string s) {
        if(s == "") return 0;
        vector<int> dp(s.size(),0);
        for(int i = 1; i < s.size(); i++){
            if(s[i] == ')'){
                if(s[i-1] == '(')//...()
                     dp[i] = (i-2)>0?dp[i-2]+2:2;
                else { //....) )
                    if(i - dp[i-1] - 1 >= 0 &&s[i-dp[i-1]-1] == '(') {
                        dp[i] = (i -dp[i-1] -2) >=0? dp[i-1] + 2 + dp[i-dp[i-1] -2]: dp[i-1]+2;
                    }
                }
            }
        }
        int res = INT_MIN;
        for(int n:dp)res = max(res, n);
        return res;

    }
};

10. 正则表达式匹配

题目链接
做的脑袋疼,好几个小时,还是迷迷糊糊
代码

class Solution {
public:
    bool isMatch(string s, string p) {
         s = " "+s;
         p = " "+p;
         int m = s.size(), n = p.size();
         vector<vector<bool>>dp(m+1, vector<bool>(n+1,false));
         dp[0][0] = true;
         for(int i = 1; i <= m; i++){
             for(int j = 1; j <= n; j++){
                 
                 if(s[i-1] == p[j-1]|| p[j-1] == '.') dp[i][j] = dp[i-1][j-1];
                 else if(p[j-1] == '*'){
                     
                     if(p[j-2] == '.'||p[j-2] == s[i-1]){
                         //分别代表匹配0个,1个,多个,其中(i-1,j)疑惑
                         dp[i][j] = dp[i][j-2]||dp[i][j-1]||dp[i-1][j];
                     }else{
                         dp[i][j] = dp[i][j-2];
                     }
                 }
             }
         }
         return dp[m][n];
    }
};

你可能感兴趣的:(算法)