题目描述:
方法1:动态规划,题目类似于最大子数组和,本题中p表示以nums[i]结尾的最大开销的子数组,val哈希表存储每个字母的开销
m是最大开销的子数组
class Solution {
public:
int maximumCostSubstring(string s, string chars, vector<int>& vals) {
unordered_map<char,int>val;
for(int i=0;i<chars.length();i++){
val[chars[i]] = vals[i];
}
int p = int(s[0] - 'a') + 1;
if(val.find(s[0]) != val.end()) p = val[s[0]];
int m = max(0,p);
for(int i=1;i<s.length();i++){
if(val.find(s[i]) != val.end())p = max(p+val[s[i]],val[s[i]]);
else p = max(p+int(s[i] - 'a')+1,int(s[i] - 'a')+1);
m = max(m,p);
}
return m;
}
};
优化:,val哈希表可以存储所有字母的价值,上个做法只存储了chars字符串中每个字母的价值,从而导致了多余的if判断
class Solution {
public:
int maximumCostSubstring(string s, string chars, vector<int>& vals) {
unordered_map<char,int>val;
for(char a='a';a<='z';a++){
val[a] = int(a-'a')+1;
}
for(int i=0;i<chars.length();i++){
val[chars[i]] = vals[i];
}
int p = val[s[0]];
int m = max(0,p);
for(int i=1;i<s.length();i++){
p = max(p+val[s[i]],val[s[i]]);
m = max(m,p);
}
return m;
}
};