主页 > 人工智能  > 

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

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 <= 105s 只包含小写英文字母。1 <= chars.length <= 26chars 只包含小写英文字母,且 互不相同 。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。

标签:

2606.找到最大开销的子字符串由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“2606.找到最大开销的子字符串