LeetCode1578.避免重复字母的最小删除成本
题目说明:
给你一个字符串 s 和一个整数数组 cost ,其中 cost[i] 是从 s 中删除字符 i 的代价。返回使字符串任意相邻两个字母不相同的最小删除成本。请注意,删除一个字符后,删除其他字符的成本不会改变。
示例1:
输入:s = “abaac” , cost = [1,2,3,4,5]
输出:3
示例2:
输入 s = “abc” , cost = [1,2,3]
输出:0
提示
- s中只有小写英文字母,
- 1 <= s.length <= 10^5
- s.length == cost.length
思路
可以采用贪心算法的思想得到最终的答案,首先判断两个字符是否相等,在两个字符相等的情况下再进行其他操作。
当两个字母相等且cost[fast] >= cost[slow]的时候,slow不用进行移动,只需移动fast。当两个字符相等且cost[fast] < cost[slow]时,slow = fast ,fast++。当连个字母不相等时,slow = fast,fast++,之所以让slow = fast,是因为slow到fast之间的元素都被删除,不能再被访问。
代码展示:
public int minCost(String s, int[] cost) {
int res = 0,slow = 0,fast = 1;
//res为删除的最小代价
//slow指向慢的那个字符,fast指向快的那个字符
char[] arr = s.toCharArray();
while(fast < s.length()){
if(arr[slow] == arr[fast]){
res += Math.min(cost[slow],cost[fast]);
if(cost[fast] >= cost[slow]){
slow=fast;
}
}else{
slow = fast;
}
fast++;
}
return res;
}
运行结果:
复杂度分析:
- 空间复杂度:O(N)
- 时间复杂度:O(N)
另外,有错误可以指正出来,感谢各位!