1. 去除重复字母
1.1. 题目描述
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的
字典序
最小(要求不能打乱其他字符的相对位置)。
1.2. 示例
示例 1:
输入:s = “bcabc”
输出:“abc”
示例 2:
输入:s = “cbacdcbc”
输出:“acdb”
1.3. 题目解析
直接看的答案:
- 统计所有的字符出现次数,记为字符余量
- 遍历
s
,每次取一个字符char,并在字符余量中减去1。 - 如果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)