前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1737. 满足三条件之一需改变的最少字符数(计数)

LeetCode 1737. 满足三条件之一需改变的最少字符数(计数)

作者头像
Michael阿明
发布2021-02-19 12:52:12
3670
发布2021-02-19 12:52:12
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

给你两个字符串 a 和 b ,二者均由小写字母组成。 一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。

操作的最终目标是满足下列三个条件 之一 :

  • a 中的 每个字母 在字母表中 严格小于 b 中的 每个字母 。
  • b 中的 每个字母 在字母表中 严格小于 a 中的 每个字母 。
  • a 和 b 都 由 同一个 字母组成。

返回达成目标所需的 最少 操作数。

代码语言:javascript
复制
示例 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. 解题

  • 计数,遍历,比赛的时候细节出了问题,一直过不了最后一个例子
代码语言:javascript
复制
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 < 25
        int 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++


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档