当前位置: 首页 > news >正文

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

给你一个字符串 s ,一个字符 互不相同 的字符串 chars 和一个长度与 chars 相同的整数数组 vals 。

子字符串的开销 是一个子字符串中所有字符对应价值之和。空字符串的开销是 0 。

字符的价值 定义如下:

  • 如果字符不在字符串 chars 中,那么它的价值是它在字母表中的位置(下标从 1 开始)。
    • 比方说,'a' 的价值为 1 ,'b' 的价值为 2 ,以此类推,'z' 的价值为 26 。
  • 否则,如果这个字符在 chars 中的位置为 i ,那么它的价值就是 vals[i] 。

请你返回字符串 s 的所有子字符串中的最大开销。


示例 1:

输入:s = "adaa", chars = "d", vals = [-1000]
输出:2
解释:字符 "a" 和 "d" 的价值分别为 1 和 -1000 。
最大开销子字符串是 "aa" ,它的开销为 1 + 1 = 2 。
2 是最大开销。

示例 2:

输入:s = "abc", chars = "abc", vals = [-1,-1,-1]
输出:0
解释:字符 "a" ,"b" 和 "c" 的价值分别为 -1 ,-1 和 -1 。
最大开销子字符串是 "" ,它的开销为 0 。
0 是最大开销。

提示:

  • 1 <= s.length <= 105
  • s 只包含小写英文字母。
  • 1 <= chars.length <= 26
  • chars 只包含小写英文字母,且 互不相同 。
  • vals.length == chars.length
  • -1000 <= vals[i] <= 1000

代码:

class Solution {
public:
    int maximumCostSubstring(string s, string chars, vector<int>& vals) {
        
        int i, val, res = 0;
        vector<int> dp(s.size(), 0);

        for(i = 0; i < s.size(); i++){
            
            if(chars.find(s[i]) != std::string::npos){
                val = vals[chars.find(s[i])];
            }
            else{
                val = s[i] - 'a' + 1;
            }

            if(i == 0){
                // 初始化
                if(val > 0) dp[i] = val;
                else dp[i] = 0;
                res = max(dp[i],  res);
            }
            else{
                
                dp[i] = max(dp[i-1] + val, val);
                res = max(dp[i],  res);
            }
            
            // cout << dp[i] << " " << res << " ";
        }

        return res;
    }
};

解题思路:

(1)使用动态规划的思想,但使用另外一个变量 res 确定最终值。

(2)首先,获取单个字符对应的价值。

(3)接着,使用动态规划的思想,看看是否当前字符需要与前子字符串进行拼接。

(4)每次判断更新最终值res。

相关文章:

  • 单片机入门(一)
  • Kconfig与CMake初步模块化工程3
  • 贪心算法--给定一个只包含X和.字符串
  • mysql表的约束
  • springboot可以同时处理多少个请求
  • 2503,D比C更易重构
  • 将md格式转jupyter并运行
  • Redis 实现延迟队列的方案
  • 【STM32项目实战系列】基于STM32G474的FDCAN驱动配置
  • 动态规划_路径问题(典型算法思想)—— OJ例题算法解析思路
  • C++20 中位移位运算符的统一行为:深入解析与实践指南
  • 紧跟 Web3 热潮,RuleOS 如何成为行业新宠?
  • 月结保障:回滚慢、行锁频发
  • UltraScale系列FPGA实现SDI转PCIE3.0采集卡,基于UltraScale GTH+XDMA架构,提供工程源码和技术支持
  • OpenCV计算摄影学(13)实现 Reinhard 全局色调映射算法的类cv::TonemapReinhard
  • 基于Arcgis的python脚本实现相邻矢量面的高度字段取平均值
  • 力扣-动态规划-583 两个字符的删除操作
  • 从0到1构建AI深度学习视频分析系统--基于YOLO 目标检测的动作序列检查系统:(0)系统设计与工具链说明
  • QT 作业 day4
  • 浅谈开发环境
  • 巩义网站建设价格/百度快速排名 搜
  • fw可以做网站/西安seo排名
  • 网站免费空间哪里申请/如何发布自己的广告
  • 做pc端网站服务/哔哩哔哩b站在线看免费
  • 济宁住房和城乡建设厅网站/关键词优化设计
  • 怎么快速提高网站权重/seo网络优化招聘