2606 找到最大开销的子字符串

题目链接:2606. 找到最大开销的子字符串

方法:动态规划

解题思路

实际是:子数组最大和

  • 初始化每个字母的价值,保存在vector<int> value(26)中;
  • dp[i]表示以s[i]结尾的子字符串的最大开销,那么就可以使得dp[i + 1]和dp[i]联系起来,有两种情况:
    • s[i+1]接到上一个子字符串的后面,dp[i - 1] + value[s[i+1] - 'a']
    • 选择s[i+1]为子字符串的起点,value[s[i+1] - 'a']
  • 取其中最大开销:dp[i+1]=max(1,2)
  • 然后答案就是所有以s[i]结尾的子字符串最大开销中的最大值。
  • 优化dp数组为O(1),有上述的计算过程可知,当前的dp值只和上一个dp值有关,那么只需要用一个dp变量就可以。

代码

class Solution {
public:
    int maximumCostSubstring(string s, string chars, vector<int>& vals) {
        vector<int> value(26);
        for (int i = 0; i < 26; i ++ ) value[i] = i + 1;
        for (int i = 0; i < chars.length(); i ++ ) value[chars[i] - 'a'] = vals[i];
        int dp = 0, ans = 0;
        for (auto &c : s) {
            dp = max(dp + value[c - 'a'], value[c - 'a']);
            ans = max(ans, dp);
        }
        return ans;
    }
};

复杂度分析

时间复杂度:O(n)
空间复杂度:O(1)

posted @   lixycc  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示