【每日刷题】Day121
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
2. 467. 环绕字符串中唯一的子字符串 - 力扣(LeetCode)
3. 300. 最长递增子序列 - 力扣(LeetCode)
1. 139. 单词拆分 - 力扣(LeetCode)
//思路:子数组动态规划问题。
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict)
{
unordered_set<string> hash;
for(auto s:wordDict) hash.insert(s);
int n = s.size();
vector<bool> dp(n+1);
s = ' '+s;//这里让字符串前面多加一个 ' ' 是为了让dp数组的填写 和 字符串的遍历下标一样。
dp[0] = true;
for(int i = 1;i<=n;i++)
{
for(int j = i;j-1>=0;j--)
{
if(dp[j-1]&&hash.find(s.substr(j,i-j+1))!=hash.end()) dp[i] = true;
}
}
return dp[n];
}
};
2. 467. 环绕字符串中唯一的子字符串 - 力扣(LeetCode)
//思路:子数组动态规划问题。
class Solution {
public:
int findSubstringInWraproundString(string s)
{
int hash[28] = {0};
int n = s.size(),ans = 0;
vector<int> dp(n,1);//dp中初始全为1,因为所有的单个字符都一定出现在环绕字符串中
for(int i = 1;i<n;i++)
{
if(s[i-1]+1==s[i]||(s[i-1]=='z'&&s[i]=='a'))//满足长度>1两个情况中的任意一个即可:
dp[i] += dp[i-1];
}
for(int i = 0;i<n;i++)
{
hash[s[i]-'a'] = hash[s[i]-'a']>dp[i]?hash[s[i]-'a']:dp[i];//去重操作
}
for(int i = 0;i<28;i++) ans+=hash[i];
return ans;
}
};
3. 300. 最长递增子序列 - 力扣(LeetCode)
//思路:子序列动态规划问题。
//本题是非常经典的一道 子序列动态规划问题。
class Solution {
public:
int lengthOfLIS(vector<int>& nums)
{
int n = nums.size(),ans = 0;
vector<int> dp(n);
dp[0] = 1;//一个数也算一个递增子序列
for(int i = 1;i<n;i++)
{
int max = 0;
for(int j = 0;j<=i-1;j++)//找到与 i 位置能够形成最长递增子序列的 某个位置 ,记录 以这个位置为结尾 的子序列的长度。
{
if(nums[i]>nums[j]) max = max>dp[j]?max:dp[j];
}
dp[i] = max+1;//+1就是后面跟个 i 时,以 i 位置为结尾时的最长递增子序列
}
for(int i = 0;i<n;i++) ans = ans>dp[i]?ans:dp[i];
return ans;
}
};