https://leetcode.com/problems/edit-distance/

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

用dp[i][j] 来表示 长度为 i 的 word1 经过 dp[i][j]次变换 可以得到长度为 j 的word2,那么我们主要考察两种情况,第一种是:word1[i] == word2[j],那么这个问题的规模便转换成了:dp[i][j] = dp[i-1][j-1]. 第二种情况是:word1[i] != word2[j],那么我们可以删除掉word1中的第 i 个字符,或者我们可以把 word1中的第 i 个字符换成与 word2[j] 相同的字符,或者我们还可以同时 删除 word1[i] 和 word2[j]. 于是状态转移方程为:dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1.

class Solution {
public:
int minDistance(string word1, string word2) {
int m = word1.length(), n = word2.length(); vector<vector<int> > dp(m+, vector<int> (n+, )); for(int i=;i<=m;++i) dp[i][] = i;
for(int j=;j<=n;++j) dp[][j] = j; for(int i=;i<=m;++i) {
for(int j=;j<=n;++j) {
if(word1[i-] == word2[j-]) {
dp[i][j] = min(dp[i-][j-], dp[i-][j]+);
}
else {
dp[i][j] = min(dp[i-][j], min(dp[i][j-], dp[i-][j-])) + ;
}
}
} return dp[m][n];
}
};

https://leetcode.com/problems/distinct-subsequences/

Given a string S and a string T, count the number of distinct subsequences of T in S.

A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ACE" is a subsequence of "ABCDE" while "AEC" is not).

Here is an example:
S = "rabbbit", T = "rabbit"

Return 3.

解题报告:用 dp[i][[j] 来表示长度为 i 的 S串 包含了几个 T串。分两种情况考虑,第一种:S[i] != T[j],那么问题转而变成求S[1,...i-1] 包含了几个 T[1...i]。因为S[i] 对解的个数不会产生影响。第二种: S[i] == T[j],那么一种可能是 S[1...i-1] 包含了 若干个 T[1...j-1],或者是S[1...i-1] 包含了 若干个T[1...j]。所以状态转移方程为:

dp[i][j] = dp[i-1][j] + dp[i-1][j-1] (if S[i] == T[j])

dp[i][j] = dp[i-1][j] (if S[i] != T[j])

class Solution {
public:
int numDistinct(string s, string t) {
int m = s.length(), n = t.length();
vector<vector<int> > dp(m+, vector<int>(n+, )); for(int i=;i<=m;++i) dp[i][] = ; for(int i=;i<=m;++i) {
for(int j=;j<=n;++j) {
if(s[i-] == t[j-]) dp[i][j] = dp[i-][j-] + dp[i-][j];
else dp[i][j] = dp[i-][j];
}
} return dp[m][n];
}
};

leetcode@ [72/115] Edit Distance & Distinct Subsequences (Dynamic Programming)的更多相关文章

  1. (LeetCode 72)Edit Distance

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  2. [Leetcode 72]编辑距离 Edit Distance

    [题目] Given two words word1 and word2, find the minimum number of operations required to convert word ...

  3. LeetCode(72) Edit Distance

    题目 Given two words word1 and word2, find the minimum number of steps required to convert word1 to wo ...

  4. [leetcode]161. One Edit Distance编辑步数为一

    Given two strings s and t, determine if they are both one edit distance apart. Note: There are 3 pos ...

  5. [LeetCode] 161. One Edit Distance 一个编辑距离

    Given two strings s and t, determine if they are both one edit distance apart. Note: There are 3 pos ...

  6. ✡ leetcode 161. One Edit Distance 判断两个字符串是否是一步变换 --------- java

    Given two strings S and T, determine if they are both one edit distance apart. 给定两个字符串,判断他们是否是一步变换得到 ...

  7. [LeetCode#161] One Edit Distance

    Problem: Given two strings S and T, determine if they are both one edit distance apart. General Anal ...

  8. 【leetcode刷题笔记】Distinct Subsequences

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  9. [LeetCode] 45. Jump Game II_ Hard tag: Dynamic Programming

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

随机推荐

  1. 详细解析: VictorOps 是如何利用和完善 ChatOps?

    ChatOps,即聊天应用,在软件开发中被广泛应用改进开发者之间的沟通.简单地说,ChatOps 是将内容或行动 (或两者) 迁移到聊天客户端.这样做之后,企业内的所有团队都能分享重要信息,行动,及其 ...

  2. 深入剖析Classloader(二)--根类加载器,扩展类加载器与系统类加载器

    原文地址:http://yhjhappy234.blog.163.com/blog/static/31632832201152555245584/?suggestedreading&wumii ...

  3. highcharts 切换

    <!doctype html> <html lang="en"> <head> <script type="text/javas ...

  4. java 用JNA方法调用C++动态链接库

    JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.非常强大.易用,功能上类似与.NET的P/Invoke.你只 ...

  5. Apache James搭建内网邮件服务器

    Apache James搭建内网邮件服务器 极客521 | 极客521 2014-08-21 148 阅读 java 大概之前两个礼拜的日子,讨论会介绍了关于了.net内网邮件服务器的搭建.所以自己也 ...

  6. P90、面试题11:数值的整数次方

    题目:实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 需要注意的地方: 1)输入的指 ...

  7. Windbg:如何给字符串下条件断点

    因为Windgb支持MASM语法,字符串的比较方法有$scmp和$sicmp.用法和c中的字符串比较方法一致.在需要比较字符串成员变量的时候,遇到了点问题.因为字符串成员变量无法直接获取字符串内容.p ...

  8. dom4j 的小小测试

    @Test public void gogo() throws IOException{ InputStream in = this.getClass().getClassLoader() .getR ...

  9. 去除html标签 正则 <.+?> 解释

    http://baike.baidu.com/link?url=2zORJF9GOjU8AkmuHDLz9cyl9yiL68PdW3frayzLwWQhDvDEM51V_CcY_g1mZ7OPdcq8 ...

  10. extends:类似于java中的继承特征,extends="struts-default"

    extends:类似于java中的继承特征,extends="struts-default"就是继承struts-default.xml,它里面定义了许多跳转类型.拦截器等一些常用 ...