博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 1143. 最长公共子序列
阅读量:2135 次
发布时间:2019-04-30

本文共 1185 字,大约阅读时间需要 3 分钟。

给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

    例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。

两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

示例 1:

输入:text1 = "abcde", text2 = "ace"

输出:3  
解释:最长公共子序列是 "ace" ,它的长度为 3 。

示例 2:

输入:text1 = "abc", text2 = "abc"

输出:3
解释:最长公共子序列是 "abc" ,它的长度为 3 。

示例 3:

输入:text1 = "abc", text2 = "def"

输出:0
解释:两个字符串没有公共子序列,返回 0 。

解题思路: 使用动态规划,求解最值问题,一般都是使用动态规划;使用二维dp数组表示不同的状态,其中dp[i][j]表示text1 [0:i-1] 与 text2[0:j-1] 的公共子序列长度, 当i = 0或者j=0时text1 [0:-1]或text2[0:-1]为空,dp[i][j]表示空字符串与任意字符串的公共子序列为dp[0][0] = 0

动态转移方程为

1. 当text1 [i-1] == text2[j-1]时, dp[i][j] = dp[i-1][j-1] + 1

2. 当text1 [i-1] !==text2[j-1]时, dp[i][j] = max(dp[i-1][j], dp[i][j-1])

class Solution:    def longestCommonSubsequence(self, text1: str, text2: str) -> int:        m = len(text1)        n = len(text2)        dp = [[0] * (n+1) for i in range((m+1))]        for i in range(1, m + 1):            for j in range(1, n + 1):                if text1[i-1] == text2[j-1]:                    dp[i][j] = dp[i-1][j-1] + 1                else:                    dp[i][j] = max(dp[i-1][j], dp[i][j-1])        return dp[m][n]

转载地址:http://hwygf.baihongyu.com/

你可能感兴趣的文章
Oracle PL/SQL语言初级教程之过程和函数
查看>>
Oracle PL/SQL语言初级教程之表和视图
查看>>
Oracle PL/SQL语言初级教程之完整性约束
查看>>
PL/SQL学习笔记
查看>>
如何分析SQL语句
查看>>
结构化查询语言(SQL)原理
查看>>
SQL教程之嵌套SELECT语句
查看>>
几个简单的SQL例子
查看>>
日本語の記号の読み方
查看>>
计算机英语编程中一些单词
查看>>
JavaScript 经典例子
查看>>
判断数据的JS代码
查看>>
js按键事件说明
查看>>
AJAX 初次体验!推荐刚学看这个满好的!
查看>>
AJAX 设计制作 在公司弄的 非得要做出这个养的 真晕!
查看>>
Linux 查看文件大小
查看>>
Java并发编程:线程池的使用
查看>>
redis单机及其集群的搭建
查看>>
Java多线程学习
查看>>
检查Linux服务器性能
查看>>