vlambda博客
学习文章列表

干货|leetcode部分动态规划记录贴


leetcode部分动态规划记录贴



如果p[j+1] 不是通配符 ‘’ ,则f[i] [j]是真,当且仅当s[i]可以和p[j]匹配,且f[i+1] [j+1]是真;如果p[j+1]是通配符 '’,则下面的情况只要有一种满足,f[i] [j]就是真;f[i] [j+2]是真;s[i]可以和p[j]匹配,且f[i+1] [j]是真;


class Solution {public: vector<vector<int>> dp; int lens, lenp; bool isMatch(string s, string p) { lens = s.size(); lenp = p.size(); dp = vector<vector<int>>(lens + 1, vector<int>(lenp + 1, -1)); return sol(s, p, 0, 0); } bool sol(string &s, string &p, int x, int y) { if(dp[x][y] != -1) return dp[x][y]; if(y == lenp) return dp[x][y] = x == lens; bool match = (s[x] == p[y] || p[y] == '.') && x < lens;// 越界 bool tmp; if(p[y + 1] == '*' && y + 1 < lenp) { tmp = ( (match && sol(s, p, x + 1, y) ) || sol(s, p, x, y + 2));// 多匹配||0匹配 } else { tmp = match && sol(s, p, x + 1, y + 1); } return tmp; }};


编辑距离


状态表示:f[i,j] 表示将 word1 的前 i 个字符变成 word2 的前 j 个字符,最少需要进行多少次操作。状态转移,一共有四种情况:


  • 将 word1[i]删除或在 word2[j]后面添加 word1[i],则其操作次数等于 f[i−1,j]+1;

  • 将 word2[j]删除或在 word1[i]后面添加 word2[j],则其操作次数等于 f[i,j−1]+1;

  • 如果 word1[i]=word2[j],则其操作次数等于 f[i−1,j−1];

  • 如果 word1[i]≠word2[j],则其操作次数等于 f[i−1,j−1]+1;
    时间复杂度分析:状态数 O(n2),状态转移复杂度是 O(1),所以总时间复杂度是 O(n2);

class Solution {public: vector<vector<int>> dp; int len1, len2; int minDistance(string word1, string word2) { len1 = word1.size(), len2 = word2.size(); dp = vector<vector<int>>(len1 + 1, vector<int>(len2 + 1)); for(int i = 0; i <= len1; i ++) dp[i][0] = i; for(int i = 0; i <= len2; i ++) dp[0][i] = i; for(int i = 1; i <= len1; i ++) { for(int j = 1; j <= len2; j ++) { if(word1[i - 1] != word2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; } else { dp[i][j] = dp[i - 1][j - 1]; } dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j]); dp[i][j] = min(dp[i][j - 1] + 1, dp[i][j]); } } return dp[len1][len2]; }};


大概率 持续更新。。。。。。。。待续



更多有趣的内容

请长按


干货|leetcode部分动态规划记录贴
干货|leetcode部分动态规划记录贴
干货|leetcode部分动态规划记录贴

长按二维码关注




戳阅读原文与作者交流