当前位置:网站首页>去除重复字母(不同字符的最小序列)问题
去除重复字母(不同字符的最小序列)问题
2022-07-16 06:04:00 【GreyZeng】
去除重复字母(不同字符的最小序列)问题
作者:Grey
原文地址:去除重复字母(不同字符的最小序列)问题
题目描述
LeetCode 316. Remove Duplicate Letters
LeetCode 1081. Smallest Subsequence of Distinct Characters
思路
由于题目说明了,字符串都是小写字母,所以第一步,
我们可以通过设置一个含有26个元素的数组来统计每个字符出现的频率
char[] str = s.toCharArray();
int[] map = new int[26];
for (char c : str) {
map[c - 'a']++;
}
通过如上方法,就可以得到每个字符的词频,
第二步,我们设置两个指针
int l = 0;
int r = 0;
先移动r指针,r每次移动一个位置,就把这个位置字符的词频减少一个,如果r某个时刻来到i位置,i位置的字符词频减少一个后就没有了,这就说明从[l...r]区间可以找到一个最小ASCII的字符开始结算了,假设[l...r]的最小ASCII字符在p位置,则我们需要做如下处理:
第一步: 将p位置的字符加入结果字符串中。
第二步:将p位置的词频设置为-1,便于标识p位置的字符已经使用过了,下次再遇到可以直接跳过:map[str[p]-'a']=-1
第三步:将[p+1...r]的字符词频重新加1,因为这部分的字符是减多了的。
第四步:r和l都来到p+1位置,继续上述处理流程。
示例图如下:
原始串和词频表如下:

接下来r位置字符的词频减少一个,r来到下一个位置

此时没有任何词频即将减少为0,继续移动r,

接下来移动r,注:此时d的词频即将减少到0,

接下来,就开始收集第一个元素,即在[l...r]区间内,找到ASCII最小的元素,即2号位置的a元素,此时,将a收集到结果字符串中,并且记录下a此时位置,即p=2。
然后,我们需要把整个字符串中a的词频设置为-1,表示a字符已经收集过了,即map['a'-'a']=-1。
最后,由于a位置是收集到的位置,而r已经遍历到了3号位置的d元素,所以从a所在的位置到r位置中的所有元素,都要重新加一次词频(因为每次移动r会删除词频)。
完整代码如下:
public static String removeDuplicateLetters(String s) {
char[] str = s.toCharArray();
int[] map = new int[26];
for (char c : str) {
map[c - 'a']++;
}
StringBuilder sb = new StringBuilder();
int l = 0;
int r = 0;
while (r < str.length) {
if (map[str[r] - 'a'] == -1 || --map[str[r] - 'a'] > 0) {
// r在一个已经处理过的位置或者r上的词频减掉后没有到0,说明现在
// 还没有来到需要统计的时刻
// r放心++
r++;
} else {
// r位置的词频已经减少到0了
// 可以结算了
int p = l;
for (int i = l; i <= r; i++) {
if (map[str[i] - 'a'] != -1 && str[i] < str[p]) {
p = i;
}
}
if (map[str[p] - 'a'] != -1) {
// 结算的位置必须是有效位置
sb.append(str[p]);
// 结算完毕后,将这个位置的词频设置为-1,便于后续判断此位置是否已经被用过
map[str[p] - 'a'] = -1;
}
for (int i = p + 1; i <= r; i++) {
// [p+1,r]之间的位置的字符,把词频还原回来,因为这部分词频是减多了的
if (map[str[i] - 'a'] != -1) {
map[str[i] - 'a']++;
}
}
l = p + 1;
r = l;
}
}
return sb.toString();
}
更多
边栏推荐
- Desai wisdom number - discount (gradient stacking chart): per capita disposable income of national residents
- altium designer原理图生成pcb
- Win11 system How to enable Net Framework 3.5?
- Chapter I environment configuration
- ES6中Array对象的方法和扩展、string的扩展方法、数组的遍历
- Brush notes - sort
- 第5章 网络通信实战
- What if win11 prompts outlook for search errors? Win11 prompt outlook search error
- 认识多银行资金系统(二)---------今日首页
- Codeforces Round #805 A - G
猜你喜欢

Codeforces Round #803 (Div. 2) D. Fixed Point Guessing
![[pytorch quantitative practice (2)]](/img/d8/491359d94998f24da45011b2c7c423.png)
[pytorch quantitative practice (2)]
![[every Monday shift] - Issue 3: web development security precautions](/img/2e/64e2f7aca24abd6b68d844e0b78a3e.jpg)
[every Monday shift] - Issue 3: web development security precautions

In depth learning (2020 Li Hongyi) learning records

基于单片机的蓝牙电子秤系统设计(#0493)

Fleet |「后台探秘」第4期:分布式事务

Codeforces Round #803 (Div. 2) B. Rising Sand

altium designer怎么添加元件库

Design of hydrogen monitoring system based on single chip microcomputer (0490)

altium designer原理图生成pcb
随机推荐
Liquibase first use
合宙Air820ug升级固件要点
XGBoostError: [10:19:14] C:\dev\libs\xgboost\src\objective\objective.cc:23:
[pytorch quantitative practice (1)]
Points clés pour la mise à niveau du firmware d'aegnus air820ug
Tomato learning notes -vscade configuring makefile (using task.jason and launch.jason)
Interview reply 2 (summarize the bad answers in the interview)
Shell脚本中的变量
HAL 固件库
【C语言笔记分享】自定义类型:结构体,枚举,联合(建议收藏)
STM32通用定时器
[每周一更]-(第3期):Web开发安全注意事项
Binary build kubernetes
第一章 环境配置
Reconstructing the geometric form of weight space with training set
Fleet | "background exploration" issue 4: distributed transactions
4-redis architecture design to usage scenario - redis request execution process
Comparison and summary of five deep learning models for time series prediction: from simulated statistical model to unsupervised model that can be pre trained
408 day attendance Chapter 8 sorting in class code collection
DataX extension vertica plug-in