日常刷题(23)

1. 去除重复字母

1.1. 题目描述

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的
字典序
最小(要求不能打乱其他字符的相对位置)。

1.2. 示例

示例 1:

输入:s = “bcabc”
输出:“abc”

示例 2:

输入:s = “cbacdcbc”
输出:“acdb”

1.3. 题目解析

直接看的答案:

  1. 统计所有的字符出现次数,记为字符余量
  2. 遍历s,每次取一个字符char,并在字符余量中减去1。
  3. 如果stack不为空、stack[-1] < char、stack[-1]在后面还有,则用char替换最后一位

1.4. 代码

from collections import Counter

class Solution:
    def __call__(self, s: str):
        cnt = Counter(s)
        stack = []
        for char in s:
            cnt[char] -= 1

            if char in stack:
                continue

            while stack and stack[-1] > char and cnt[stack[-1]]:
                stack.pop()

            stack.append(char)

        return ''.join(stack)

2. 全排列

2.1. 题目描述

给定一个只包含大写英文字母的字符串S,要求你给出对S重新排列的所有不相同的排列数。

如:S为ABA,则不同的排列有ABA、AAB、BAA三种。

2.2. 输入描述

输入一个长度不超过10的字符串S,我们确保都是大写的。

2.3. 输出描述

输出S重新排列的所有不相同的排列数(包含自己本身)。

2.4. 用例

输入 ABA
输出 3
说明 无

输入 ABCDEFGHHA
输出 907200
说明 无

2.5. 题目解析

数学题,不相同的N个对象有N!种排列方式。有x个重复的 α \alpha α时,有 N ! / x ! N! / x! N!/x!种排列方式

2.6. 代码

class Solution:
    def __call__(self, s: str):
        cnt = Counter(s)
        ans = fact(len(s))
        for _, v in cnt.items():
            ans /= fact(v)
        return int(ans)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值