当前位置:首页 > 力扣题解 > 力扣746题 使用动态规划方法的解题思路和步骤 C++代码实现 动态规划基础例题

力扣746题 使用动态规划方法的解题思路和步骤 C++代码实现 动态规划基础例题

3周前 (05-12)力扣题解64

本文将探讨力扣(LeetCode)第746题的解题思路,重点分析如何使用动态规划方法来解决这一问题,并提供C++代码实现。

截图未命名.jpg 力扣746题 使用动态规划方法的解题思路和步骤 C++代码实现 动态规划基础例题 动态规划 C++ 第1张

动态规划基础

动态规划是一种算法策略,用于解决具有重叠子问题和最优子结构特性的问题。在力扣第746题中,这类特性尤为明显,使得动态规划成为解决问题的理想方法。

动态规划通常涉及状态转移方程的构建,该方程描述了问题的最优解如何由子问题的最优解构成。

力扣746题描述

题目要求我们找出给定字符串中最短的连续子字符串,该子字符串包含所有ASCII字符至少一次。

,对于字符串"abcde",最短的包含所有字符的子字符串是"abcde"。

解题步骤

我们需要初始化一个数组存储每个字符一次出现的位置。使用两个指针表示子字符串的开始和结束位置,动态地调整这两个指针以寻找最短的子字符串。

在调整过程中,我们需要计算当前子字符串包含所有字符的最小长度,并更新全局最短长度。

状态转移方程

状态转移方程是动态规划中的核心,对于本题,我们可以定义dp[i]表示以第i个字符结尾的最短子字符串的长度。

状态转移方程可以表示为:dp[i] = min(dp[i], dp[j] + i - j),其中j是一个不包含i字符的位置。

案例分析

案例1:字符串"abc"

对于字符串"abc",最短的包含所有字符的子字符串是"abc"本身,长度为3。

分析:由于字符串中每个字符只出现一次,且连续出现,因此不需要任何调整即可满足条件。

C++代码实现

以下是使用动态规划方法解决力扣746题的C++代码实现:

    #include <iostream>
    #include <vector>
    #include <unordered_map>
    using namespace std;

    class Solution {
    public:
        int minDistance(string word, string s) {
            int wordLen = word.size(), sLen = s.size();
            vector<int> lastPos(26, -1);
            int left = 0, right = 0, count = 0, minLen = INT_MAX;
            while (right < sLen) {
                char c = s[right];
                if (lastPos[c - 'a'] == -1) count++;
                lastPos[c - 'a'] = right;
                // 当所有字符都至少出现一次时
                while (count == wordLen) {
                    if (right - left + 1 < minLen) minLen = right - left + 1;
                    char d = s[left++];
                    if (lastPos[d - 'a'] == left - 1) count--;
                    lastPos[d - 'a'] = -1;
                }
                right++;
            }
            return minLen == INT_MAX ? 0 : minLen;
        }
    };


力扣746题是一个典型的动态规划问题,通过构建状态转移方程和合理地调整子字符串的边界,我们可以有效地找到最短的包含所有字符的子字符串。

原创内容 转载请注明出处

标签: 动态规划C++
分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。