No.53 - leetCode1143 - 最长公共子序列

本文深入探讨了求解两个字符串最长公共子序列问题的动态规划算法实现。通过使用二维数组dp来记录中间状态,算法能够高效地找到最长公共子序列的长度。文章详细解释了算法的工作原理,包括初始化dp数组、遍历字符串比较字符以及更新dp数组的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int N = text1.length();
        int M = text2.length();
        int dp[N+1][M+1];
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=N;i++){
            for(int j=1;j<=M;j++){
                if(text2[j-1] == text1[i-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[N][M];
    }
};
### LeetCode 高频 100 题概述 LeetCode 的高频题目通常指的是那些在技术面试中经常被提及的经典算法问题。这些问题涵盖了广泛的主题,包括但不限于数组、链表、二叉树、动态规划等。 #### 找重复数 针对 `findDuplicate` 函数实现,该函数用于在一个含有 n + 1 个整数的数组 `nums` 中找到唯一的重复数字,其中每个整数都在 1 到 n (含 n)之间[^1]: ```python class Solution: def findDuplicate(self, nums: List[int]) -> int: left, right = 1, len(nums) - 1 while left <= right: count = 0 mid = left + (right - left) // 2 for i in range(len(nums)): if nums[i] <= mid: count += 1 if count > mid: right = mid - 1 else: left = mid + 1 return left ``` 这段代码利用了二分查找的思想,在 O(n log n) 时间复杂度内解决了寻找重复元素的问题。 #### 普通栈的应用——有效括号验证 对于有效的括号匹配问题(LeetCode No.20),这是一个典型的使用栈结构解决问题的例子。通过遍历输入字符串中的每一个字符并根据其是否为左括号或右括号来进行入栈或出栈操作,可以有效地判断给定的括号串是否合法。 #### 动态规划与滚动数组优化 当涉及到计算两个字符串之间的最长公共子序列长度时,则需要用到动态规划方法。为了进一步减少内存消耗,可以通过引入滚动数组的方式简化二维 DP 表格的空间占用情况。具体而言就是在外循环变量增加的过程中逐步更新状态转移方程,从而达到降低存储需求的目的[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值