力扣746题 使用动态规划方法的解题思路和步骤 C++代码实现 动态规划基础例题
本文将探讨力扣(LeetCode)第746题的解题思路,重点分析如何使用动态规划方法来解决这一问题,并提供C++代码实现。
动态规划基础
动态规划是一种算法策略,用于解决具有重叠子问题和最优子结构特性的问题。在力扣第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题是一个典型的动态规划问题,通过构建状态转移方程和合理地调整子字符串的边界,我们可以有效地找到最短的包含所有字符的子字符串。
原创内容 转载请注明出处