当前位置:网站首页>Supprimer les lettres dupliquées [avidité + pile monotone (maintenir la séquence monotone avec un tableau + Len)]
Supprimer les lettres dupliquées [avidité + pile monotone (maintenir la séquence monotone avec un tableau + Len)]
2022-07-04 14:14:00 【Ren Lindson.】
Avidité+Pile monotone
Préface
Quand il s'agit d'un problème de mots,La plupart impliquent des algorithmes gourmands,Cette situation,Pour comprendre le processus de cupidité,Ensuite, il est incorporé dans le Code.
Quand il s'agit d'ordre relatif/Les tailles avant et arrière,En général, la pile monotone est nécessaire pour la maintenance,Scénario commun:Retour en arrière par rapport au retour en arrière.
Pour la pile monotone/hashQuelque chose comme ça.,Une situation où un tableau peut être utilisé,On peut toujours utiliser un tableau,InJVMNiveau,En effetAPILes couches sont beaucoup plus rapides.,Et simple et léger.
Un.、Supprimer les lettres en double
2.、Avidité+Pile monotone
1、stack
// Supprimer la chaîne dupliquée
public class RemoveDuplicateLetters {
/* target:Supprimer les lettres en double,L'ordre minimal du dictionnaire qui doit renvoyer les résultats est. Quands[i] >= s[i+1]Ets[i]Il y a beaucoup de situations,Alors...s[i]Remplacer par‘#’No.,Et puiss[i - 1]Le cas échéant,Et aussi avecs[i+1]Comparaison. Ce sentiment de retour en arrière,La vérité est une sorte de pensée monotone. */
public String removeDuplicateLetters(String s) {
char[] arr = s.toCharArray();
// Notez combien il y a par caractère .
int[] fx = new int[26];
for (char c : arr) fx[c - 'a']++;
// Poids mort.
Stack<Character> sk = new Stack<>();
int[] set = new int[26];
for (int i = 0; i < arr.length; i++) {
// Mets le grand devant , Et il y a des caractères en double , Pour éliminer , Gardez l'avant aussi monotone que possible , Même si ce n'est pas monotone , Ce caractère doit être seulement 1- Oui..
while (!sk.isEmpty() && sk.peek() > arr[i] && fx[sk.peek() - 'a'] != 1 && set[arr[i] - 'a'] == 0) {
System.out.println(fx[sk.peek() - 'a']);
--fx[sk.peek() - 'a'];
set[sk.pop() - 'a'] = 0;
}
// Ajouter de nouveaux caractères , Si le nouveau caractère a déjà été ajouté , Pas besoin d'ajouter ça , Après tout, les mêmes petits caractères doivent être placés devant le plus petit .
if (set[arr[i] - 'a'] == 0) {
// Il n'y a pas de , Et les caractères qui sont relativement monotones par rapport aux caractères de la pile monotone .
sk.push(arr[i]);
// Définir qu'il existe déjà dans la pile monotone .
set[arr[i] - 'a'] = 1;
} else --fx[arr[i] - 'a'];// Caractères à supprimer , Donc le nombre doit être réduit 1
}
// Combiner des caractères relativement monotones en chaînes monotones .
StringBuilder sb = new StringBuilder();
while (!sk.isEmpty()) sb.insert(0, sk.pop());
return sb.toString();
}
public static void main(String[] args) {
new RemoveDuplicateLetters().removeDuplicateLetters("abafdsfasfasdfasdfasdfasfsdagewha");
}
}
2、Tableau natif+lenSubstitutionstack
// Une tentative audacieuse, Remplacer la pile par un tableau .
// Bien sûr., Les tableaux natifs sont vraiment rapides .
class RemoveDuplicateLetters2 {
/* target:Supprimer les lettres en double,L'ordre minimal du dictionnaire qui doit renvoyer les résultats est. Quands[i] >= s[i+1]Ets[i]Il y a beaucoup de situations,Alors...s[i]Remplacer par‘#’No.,Et puiss[i - 1]Le cas échéant,Et aussi avecs[i+1]Comparaison. Ce sentiment de retour en arrière,La vérité est une sorte de pensée monotone. */
public String removeDuplicateLetters(String s) {
char[] arr = s.toCharArray();
// Notez combien il y a par caractère .
int[] fx = new int[26];
for (char c : arr) fx[c - 'a']++;
// Poids mort.
char[] sk = new char[s.length()];
int skLen = 0;
int[] set = new int[26];
for (int i = 0; i < arr.length; i++) {
// Mets le grand devant , Et il y a des caractères en double , Pour éliminer , Gardez l'avant aussi monotone que possible , Même si ce n'est pas monotone , Ce caractère doit être seulement 1- Oui..
while (skLen != 0 && sk[skLen - 1] > arr[i] && fx[sk[skLen - 1] - 'a'] != 1 && set[arr[i] - 'a'] == 0) {
System.out.println(fx[sk[skLen - 1] - 'a']);
--fx[sk[skLen - 1] - 'a'];
set[sk[--skLen] - 'a'] = 0;
}
// Ajouter de nouveaux caractères , Si le nouveau caractère a déjà été ajouté , Pas besoin d'ajouter ça , Après tout, les mêmes petits caractères doivent être placés devant le plus petit .
if (set[arr[i] - 'a'] == 0) {
// Il n'y a pas de , Et les caractères qui sont relativement monotones par rapport aux caractères de la pile monotone .
sk[skLen++] = arr[i];
// Définir qu'il existe déjà dans la pile monotone .
set[arr[i] - 'a'] = 1;
} else --fx[arr[i] - 'a'];// Caractères à supprimer , Donc le nombre doit être réduit 1
}
// Combiner des caractères relativement monotones en chaînes monotones .
StringBuilder sb = new StringBuilder();
while (skLen != 0) sb.insert(0, sk[--skLen]);
return sb.toString();
}
}
Résumé
1) Les mots les plus importants , Associations avides de connaissances ; Impliquant l'ordre / Classes de taille avant et arrière , Point de connaissance de la pile monotone associative .
2)Tableauhash/Pile d'émulation de tableau,Par rapport àHashMap/StackCatégorie,Plus vite., Tout comme le tri de tas natif est plus rapide que la file d'attente prioritaire .
Références
边栏推荐
- Deming Lee listed on Shenzhen Stock Exchange: the market value is 3.1 billion, which is the husband and wife of Li Hu and Tian Hua
- Summary of recent days (non-technical article)
- Use the default route as the route to the Internet
- 吃透Chisel语言.06.Chisel基础(三)——寄存器和计数器
- MySQL之详解索引
- 2022危险化学品经营单位主要负责人练习题及模拟考试
- 205. 同构字符串
- FS4059C是5V输入升压充电12.6V1.2A给三节锂电池充电芯片 输入小电流不会拉死,温度60°建议1000-1100MA
- 392. 判断子序列
- 如何游戏出海代运营、游戏出海代投
猜你喜欢
Unity shader learning (3) try to draw a circle
[matlab] summary of conv, filter, conv2, Filter2 and imfilter convolution functions
392. Judgement subsequence
CVPR 2022 | 大幅减少零样本学习所需的人工标注,提出富含视觉信息的类别语义嵌入(源代码下载)...
MySQL之详解索引
吃透Chisel语言.05.Chisel基础(二)——组合电路与运算符
基于PaddleX的智能零售柜商品识别
Huahao Zhongtian rushes to the scientific and Technological Innovation Board: the annual loss is 280million, and it is proposed to raise 1.5 billion. Beida pharmaceutical is a shareholder
Understand chisel language thoroughly 05. Chisel Foundation (II) -- combinational circuits and operators
小程序直播 + 电商,想做新零售电商就用它吧!
随机推荐
China Post technology rushes to the scientific innovation board: the annual revenue is 2.058 billion, and the postal group is the major shareholder
markdown 语法之字体标红
[C question set] of VII
R语言使用epiDisplay包的dotplot函数通过点图的形式可视化不同区间数据点的频率、使用by参数指定分组参数可视化不同分组的点图分布
BLOB,TEXT GEOMETRY or JSON column 'xxx' can't have a default value query 问题
学内核之三:使用GDB跟踪内核调用链
吃透Chisel语言.09.Chisel项目构建、运行和测试(一)——用sbt构建Chisel项目并运行
[FAQ] summary of common causes and solutions of Huawei account service error 907135701
如何游戏出海代运营、游戏出海代投
【FAQ】华为帐号服务报错 907135701的常见原因总结和解决方法
R语言使用dplyr包的mutate函数对指定数据列进行标准化处理(使用mean函数和sd函数)并基于分组变量计算标准化后的目标变量的分组均值
sharding key type not supported
Blob, text geometry or JSON column'xxx'can't have a default value query question
做事的真正意义和目的,真正想得到什么
Unittest框架中引入TestFixture
富文本编辑:wangEditor使用教程
WS2818M是CPC8封装,是三通道LED驱动控制专用电路外置IC全彩双信号5V32灯可编程led灯带户外工程
使用默认路由作为指向Internet的路由
Interview disassembly: how to check the soaring usage of CPU after the system goes online?
C# wpf 实现截屏框实时截屏功能