2287. 重排字符形成目标字符串

文章介绍了如何使用哈希表来统计两个字符串`s`和`target`中各字符出现的次数,通过计算`mp1[c]/mp2[c]`的最小值来确定重组字符的最少次数。这种方法具有O(n)的时间复杂度和O(1)的空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解法一:哈希表计数

首先使用两个哈希表mp1mp1mp1,mp2mp2mp2分别统计ssstargettargettarget中每个字母的个数。由于要统计target出现的次数,那么统计targettargettarget中每个单词在sss出现的最小次数,对于重复的字母来说那么需要将次数除以相应的重复次数。那么遍历targettargettarget所有字符,求出mp1[c]/mp2[c]mp1[c]/mp2[c]mp1[c]/mp2[c]的最小值即可。

  • 时间复杂度:O(n)O(n)O(n)
  • 空间复杂度:O(1)O(1)O(1)
class Solution {
    public int rearrangeCharacters(String s, String t) {
        int[] mp1 = new int[128], mp2 = new int[128];
        for (char c : s.toCharArray()) mp1[c]++;
        for (char c : t.toCharArray()) mp2[c]++;
        int ans = 105;
        for (char c : t.toCharArray()) ans = Math.min(mp1[c] / mp2[c], ans);;     
        return ans;
    }
}
class Solution {
public:
    int rearrangeCharacters(string s, string t) { 
        vector<int> mp1(26, 0), mp2(26, 0);
        for (char& c : s) mp1[c - 'a']++;
        for (char& c : t) mp2[c - 'a']++;
        int ans = 105;
        for (char&c : t) ans = min(mp1[c - 'a'] / mp2[c - 'a'], ans);;     
        return ans;
    }
};

如果有问题,欢迎评论区交流, 如果有帮助到你,请给题解点个赞和收藏哈~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值