LeetCode5662. 满足三条件之一需改变的最少字符数

思路:来源于y总,自己卡住了

本题依旧是枚举,加些数组哈希统计字母出现次数(哈希专题遇到过)。

条件三,要让两个字符串的字母全部相等的最小操作次数

若两个字符串最终要变为同一个字母,假设是c,那需要的操作次数为:a.length() + b.length() - s1[c] - s2[c],其中 s1[c], s2[c] 分别代表字符串a、b中字母 c 出现的次数。总的次数就是把两个字符串中不是字母c的改为c

条件一,让字符串a中所有字母小于字符串b中所有字母

假设分界点为 j , 所需要操作次数就是:s1[ j—‘z']  + s2[a—’j'-1] ,就是把字符串a中所有大于等于 j 的字母变为小于 j,把字符串b中所有小于 j 的变为大于 j

暴力枚举每一个可能的分界点,然后找到最小的操作次数。

代码

复制代码
 1 class Solution {
 2 public:
 3     int work(vector<int>s1,vector<int>s2){
 4         //将s1中的所有字母小于s2中的所有字母
 5         //方法就是暴力枚举所有可能的分界点
 6         int res = INT_MAX;
 7         //分界点从b开始,即下标为1开始,因为s2中所有字母要严格大于s1中的
 8         for(int j = 1;j < 26;j++){
 9             int cnt = 0;
10             for(int i = j;i < 26;i++) cnt += s2[i];  //将s2中大于等于i的加和
11             for(int i = 0;i < j;i++) cnt += s1[i];  //将s1中小于i的加和
12             res = min(res,cnt);
13         }
14         return res;
15     } 
16     
17     int minCharacters(string a, string b) {
18         //存放每个字母出现的次数,用数组做哈希
19         vector<int>s1(26);
20         vector<int>s2(26);
21         for(auto c:a) s1[c-'a']++;
22         for(auto c:b) s2[c-'a']++;
23 
24         //满足条件三的最小操作数,核心就是暴力枚举每个可能的出现字母
25         int n = a.size(), m = b.size();
26         int res = INT_MAX;
27         for(int i = 0;i < 26;i++){
28             res = min(res,n+m-(s1[i]+s2[i]));
29         }
30         //条件一、条件二本质一样
31         return min(res,min(work(s1,s2),work(s2,s1)));
32     }
33 };
复制代码

 

posted @   Uitachi  阅读(174)  评论(0)    收藏  举报
编辑推荐:
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
阅读排行:
· 7 个最近很火的开源项目「GitHub 热点速览」
· DeepSeekV3:写代码很强了
· Visual Studio 2022 v17.13新版发布:强化稳定性和安全,助力 .NET 开发提
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· 让 AI 对接 MySQL 数据库实现快速问答对话
点击右上角即可分享
微信分享提示