标签:字符 26 int s2 s1 最少 LeetCode5662 res 字母
思路:来源于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 };
标签:字符,26,int,s2,s1,最少,LeetCode5662,res,字母 来源: https://www.cnblogs.com/fresh-coder/p/14321381.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。