文章目录
- 1. 题目
- 2. 解题
1. 题目
给你两个字符串 a 和 b ,二者均由小写字母组成。
一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。
操作的最终目标是满足下列三个条件 之一 :
- a 中的 每个字母 在字母表中 严格小于 b 中的 每个字母 。
- b 中的 每个字母 在字母表中 严格小于 a 中的 每个字母 。
- a 和 b 都 由 同一个 字母组成。
返回达成目标所需的 最少 操作数。
示例 1:
输入:a = "aba", b = "caa"
输出:2
解释:满足每个条件的最佳方案分别是:
1) 将 b 变为 "ccc",2 次操作,满足 a 中的每个字母都小于 b 中的每个字母;
2) 将 a 变为 "bbb" 并将 b 变为 "aaa",3 次操作,满足 b 中的每个字母都小于 a 中的每个字母;
3) 将 a 变为 "aaa" 并将 b 变为 "aaa",2 次操作,满足 a 和 b 由同一个字母组成。
最佳的方案只需要 2 次操作(满足条件 1 或者条件 3)。示例 2:
输入:a = "dabadd", b = "cda"
输出:3
解释:满足条件 1 的最佳方案是将 b 变为 "eee" 。提示:
1 <= a.length, b.length <= 10^5
a 和 b 只由小写字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/change-minimum-characters-to-satisfy-one-of-three-conditions
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 计数,遍历,比赛的时候细节出了问题,一直过不了最后一个例子
class Solution {
public:int minCharacters(string a, string b) {int n1[26] = {0}, n2[26] = {0};int n[26] = {0};char maxa='a', mina='z', maxb = 'a', minb = 'z';for(auto c : a){n1[c-'a']++;n[c-'a']++;maxa = max(maxa, c);mina = min(mina, c);}for(auto c : b){n2[c-'a']++;n[c-'a']++;maxb = max(maxb, c);minb = min(minb, c);}// 自然满足条件if(minb > maxa || mina > maxb) return 0;int maxchar = 0;//所有字符最多的for(int i= 0; i < 26; i++)maxchar = max(maxchar, n[i]);int ans = a.size()+b.size()-maxchar;//两人都变成这个字符// 以下是比赛时写错的代码,最后一个例子过不了// ---------------------// "a"// "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"// --------------------------------------// int numa = 0, numb = 0;// for(int i = 0; i < 26; i++)// {// numa += n1[i];// numb += n2[i];// ans = min(ans, int(a.size())-numa+numb);// ans = min(ans, int(b.size())-numb+numa);// }// 要改的话,就是把 26 改成 25,a [i+1,25] 的字符改到前面,+ b [0, i] 的改到后面// i+1 < 26 , i < 25int numa = n1[0], numb = n2[0]; for(int i = 1; i < 26; i++){// a [i,25] 的字符改到前面,+ b [0, i-1] 的改到后面ans = min(ans, int(a.size())-numa+numb);// b [i,25] 的字符改到前面,+ a [0, i-1] 的改到后面ans = min(ans, int(b.size())-numb+numa);numa += n1[i];numb += n2[i];}return ans;}
};
60 ms 14.5 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!