题目描述:
给你一个字符串 s
和一个整数数组 cost
,其中 cost[i]
是从 s
中删除字符 i 的代价。
返回使字符串任意相邻两个字母不相同的最小删除成本。
请注意,删除一个字符后,删除其他字符的成本不会改变。
示例 1:
输入:s = "abaac", cost = [1,2,3,4,5]
输出:3
解释:删除字母 "a" 的成本为 3,然后得到 "abac"(字符串中相邻两个字母不相同)。
示例 2:
输入:s = "abc", cost = [1,2,3]
输出:0
解释:无需删除任何字母,因为字符串中不存在相邻两个字母相同的情况。
示例 3:
输入:s = "aabaa", cost = [1,2,3,4,1]
输出:2
解释:删除第一个和最后一个字母,得到字符串 ("aba") 。
提示:
s.length == cost.length
1 <= s.length, cost.length <= 10^5
1 <= cost[i] <= 10^4
s
中只含有小写英文字母
解题思路:
如果采用当遇到相同的字符删除除代价最大的字符以及字符的代价,时间复杂度耗时较长;
1)、采用的是tmp
保留的每个字符的最大的价值cost
;
2)、ret
记录的是删除字符的总代价;
3)、ret - tmp
即为所求的结果 ;
代码实现:
class Solution {
public:
int minCost(string s, vector<int>& cost) {
int i , ret= 0 , tmp = cost.back() ;
for (i = 0 ; i < cost.size() ; i ++) ret += cost[i] ;
char cur = s.back();
//tmp就是保留的代价
for (i = s.length() - 2; i > -1 ; i --)
{
while (i > -1 &&cur == s[i]){
tmp = max(cost[i] , tmp) ;
i -- ;
}
if (i > -1)
{
ret -= tmp ;
cur = s[i] ;
tmp = cost[i] ;
}
}
ret -= tmp ;
return ret ;
}
};