LeetCode2716
LeetCode.2716:最小化字符串长度
这道题的核心就是把题干等价化,题干叽里咕噜说了半天,实际上就是把字符串中独特的字母找出来,直接用哈希表解决即可。
题目描述
给你一个下标从 0 开始的字符串 s
,重复执行下述操作 任意 次:
- 在字符串中选出一个下标
i
,并使c
为字符串下标i
处的字符。并在i
左侧(如果有)和 右侧(如果有)各 删除 一个距离i
最近 的字符c
。
请你通过执行上述操作任意次,使 s
的长度 最小化 。
返回一个表示 最小化 字符串的长度的整数。
示例
示例1:
1 | 输入:s = "aaabc" |
示例2:
1 | 输入:s = "cbbd" |
示例3:
1 | 输入:s = "dddaaa" |
提示:
1 | 1 <= s.length <= 100 |
我的题解
还是那句话,题干叽里咕噜说了半天,可以任意次从字符串中选定一个字符,然后在它左侧或者右侧各删除一个距离它最近的相同字符,还加了一句$左侧(如果有)$和$右侧(如果有)$。那岂不就是说可以任意删除一个与选定字符相同的字符,所以说删到最后不就剩它本身删不掉了。
使用set统计s中有多少种字符即可。
代码
1 | class Solution { |
复杂度分析
- 时间复杂度:$O(n)$,其中 n 是字符串 s 的长度。
- 空间复杂度:$O(1)$。
std::set用法
$set.count(i):$ 查找$set$中$i$的数量,因为$set$中的元素是独特的,故而只会返回1或者0,而1代表$set$中存在元素$i$,0自然代表该$set$中不存在元素$i$。
$set.insert(i):$向集合$set$中插入元素$i$,如果已存在,则忽略。也就是说可以重复插入同一个元素,但是只会储存一次。