当前位置:网站首页>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
边栏推荐
- BLOB,TEXT GEOMETRY or JSON column 'xxx' can't have a default value query 问题
- 吃透Chisel语言.05.Chisel基础(二)——组合电路与运算符
- Summary of recent days (non-technical article)
- 英视睿达冲刺科创板:年营收4.5亿 拟募资9.79亿
- 1200. 最小绝对差
- Ws2818m is packaged in cpc8. It is a special circuit for three channel LED drive control. External IC full-color double signal 5v32 lamp programmable LED lamp with outdoor engineering
- R语言使用lattice包中的bwplot函数可视化箱图(box plot)、par.settings参数自定义主题模式
- 以房抵债能否排除强制执行
- 【Antd踩坑】Antd Form 配合Input.Group时出现Form.Item所占据的高度不对
- 【R语言数据科学】:交叉验证再回首
猜你喜欢

【Antd】Antd 如何在 Form.Item 中有 Input.Gourp 时获取 Input.Gourp 的每一个 Input 的value
![[FAQ] summary of common causes and solutions of Huawei account service error 907135701](/img/43/1a9786c89a5ab21d1fb8903cb7b77e.png)
[FAQ] summary of common causes and solutions of Huawei account service error 907135701

Understanding and difference between viewbinding and databinding

Dgraph: large scale dynamic graph dataset

JVM 内存布局详解,图文并茂,写得太好了!

CVPR 2022 | greatly reduce the manual annotation required for zero sample learning, and propose category semantic embedding rich in visual information (source code download)

TestSuite and testrunner in unittest

Mask wearing detection based on yolov1

数据仓库面试问题准备

Understand chisel language thoroughly 10. Chisel project construction, operation and testing (II) -- Verilog code generation in chisel & chisel development process
随机推荐
華昊中天沖刺科創板:年虧2.8億擬募資15億 貝達藥業是股東
德明利深交所上市:市值31亿 为李虎与田华夫妻档
R语言dplyr包summarise_if函数计算dataframe数据中所有数值数据列的均值和中位数、基于条件进行数据汇总分析(Summarize all Numeric Variables)
Read excel table data
2022g3 boiler water treatment examination question simulation examination question bank and simulation examination
C language programming topic reference
Worried about "cutting off gas", Germany is revising the energy security law
R语言ggplot2可视化:gganimate包创建动态折线图动画(gif)、使用transition_reveal函数在动画中沿给定维度逐步显示数据
Fs7867s is a voltage detection chip used for power supply voltage monitoring of digital system
2022 hoisting machinery command examination simulation 100 questions simulation examination platform operation
测试流程整理(3)
【FAQ】华为帐号服务报错 907135701的常见原因总结和解决方法
30: Chapter 3: develop Passport Service: 13: develop [change / improve user information, interface]; (use * * * Bo class to accept parameters, and use parameter verification)
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
Huahao Zhongtian sprint Technology Innovation Board: perte annuelle de 280 millions de RMB, projet de collecte de fonds de 1,5 milliard de Beida Pharmaceutical est actionnaire
好博医疗冲刺科创板:年营收2.6亿 万永钢和沈智群为实控人
【C 题集】of Ⅶ
2022 practice questions and mock exams for the main principals of hazardous chemical business units
安装Mysql
sharding key type not supported