当前位置:网站首页>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
边栏推荐
- R语言使用dplyr包的mutate函数对指定数据列进行标准化处理(使用mean函数和sd函数)并基于分组变量计算标准化后的目标变量的分组均值
- golang fmt.printf()(转)
- Understanding and difference between viewbinding and databinding
- 基于YOLOv1的口罩佩戴检测
- [R language data science]: cross validation and looking back
- Secretary of Homeland Security of the United States: domestic violent extremism is one of the biggest terrorist threats facing the United States at present
- 【Antd】Antd 如何在 Form.Item 中有 Input.Gourp 时获取 Input.Gourp 的每一个 Input 的value
- 数据仓库面试问题准备
- Install and use MAC redis, connect to remote server redis
- 2022g3 boiler water treatment examination question simulation examination question bank and simulation examination
猜你喜欢
【Antd】Antd 如何在 Form.Item 中有 Input.Gourp 时获取 Input.Gourp 的每一个 Input 的value
sharding key type not supported
小程序直播 + 电商,想做新零售电商就用它吧!
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
Unity shader learning (3) try to draw a circle
Unity Shader学习(三)试着绘制一个圆
Product identification of intelligent retail cabinet based on paddlex
基于YOLOv1的口罩佩戴检测
Understand chisel language thoroughly 11. Chisel project construction, operation and test (III) -- scalatest of chisel test
Understand chisel language thoroughly 05. Chisel Foundation (II) -- combinational circuits and operators
随机推荐
The mouse wheel of xshell/bash/zsh and other terminals is garbled (turn)
sharding key type not supported
自主工业软件的创新与发展
Understand chisel language thoroughly 08. Chisel Foundation (V) -- wire, REG and IO, and how to understand chisel generation hardware
Migration from go vendor project to mod project
php 日志调试
BLOB,TEXT GEOMETRY or JSON column 'xxx' can't have a default value query 问题
吃透Chisel语言.12.Chisel项目构建、运行和测试(四)——Chisel测试之ChiselTest
ARouter的使用
Variable promotion and function promotion in JS
MySQL version 8 installation Free Tutorial
【R语言数据科学】:交叉验证再回首
R语言使用epiDisplay包的followup.plot函数可视化多个ID(病例)监测指标的纵向随访图、使用stress.col参数指定强调线的id子集的颜色(色彩)
2022危险化学品经营单位主要负责人练习题及模拟考试
Haobo medical sprint technology innovation board: annual revenue of 260million Yonggang and Shen Zhiqun are the actual controllers
FS4059C是5V输入升压充电12.6V1.2A给三节锂电池充电芯片 输入小电流不会拉死,温度60°建议1000-1100MA
吃透Chisel语言.05.Chisel基础(二)——组合电路与运算符
Blob, text geometry or JSON column'xxx'can't have a default value query question
C language programming topic reference
Dgraph: large scale dynamic graph dataset