File tree Expand file tree Collapse file tree 3 files changed +53
-1
lines changed
src/main/java/com/diguage/algo/leetcode Expand file tree Collapse file tree 3 files changed +53
-1
lines changed Original file line number Diff line number Diff line change 1
1
[#0316-remove-duplicate-letters]
2
2
= 316. 去除重复字母
3
3
4
- https://leetcode.cn/problems/remove-duplicate-letters/[LeetCode - 316. 去除重复字母 ^]
4
+ https://leetcode.cn/problems/remove-duplicate-letters/[LeetCode - 316. 去除重复字母^]
5
5
6
6
给你一个字符串 `s` ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 *返回结果的字典序最小* (要求不能打乱其他字符的相对位置)。
7
7
@@ -50,6 +50,15 @@ include::{sourcedir}/_0316_RemoveDuplicateLetters.java[tag=answer]
50
50
include::{sourcedir}/_0316_RemoveDuplicateLetters_2.java[tag=answer]
51
51
----
52
52
--
53
+
54
+ 三刷::
55
+ +
56
+ --
57
+ [{java_src_attr}]
58
+ ----
59
+ include::{sourcedir}/_0316_RemoveDuplicateLetters_3.java[tag=answer]
60
+ ----
61
+ --
53
62
====
54
63
55
64
Original file line number Diff line number Diff line change @@ -1509,6 +1509,11 @@ endif::[]
1509
1509
|{doc_base_url} /0003-longest-substring-without-repeating-characters.adoc[题解]
1510
1510
|✅ 复习 {doc_base_url} /0000-09-sliding-window.adoc[Sliding Window 滑动窗口]。我采用的是计数法,也可以采用地址法。
1511
1511
1512
+ |{counter:codes2503}
1513
+ |{leetcode_base_url} /remove-duplicate-letters/[316. 去除重复字母^]
1514
+ |{doc_base_url} /0316-remove-duplicate-letters.adoc[题解]
1515
+ |❌ 复习 {doc_base_url} /0000-10-monotonic-stack.adoc[Monotonic Stack 单调栈]。知道是单调栈,代码还是没写出来!看到题解,又里面秒懂。
1516
+
1512
1517
|===
1513
1518
1514
1519
截止目前,本轮练习一共完成 {codes2503} 道题。
Original file line number Diff line number Diff line change
1
+ package com .diguage .algo .leetcode ;
2
+
3
+ public class _0316_RemoveDuplicateLetters_3 {
4
+ // tag::answer[]
5
+
6
+ /**
7
+ * @author D瓜哥 · https://www.diguage.com
8
+ * @since 2025-09-11 21:13:45
9
+ */
10
+ public String removeDuplicateLetters (String s ) {
11
+ char [] chars = s .toCharArray ();
12
+ int [] counter = new int [26 ];
13
+ for (char c : chars ) {
14
+ counter [c - 'a' ]++;
15
+ }
16
+ boolean [] added = new boolean [26 ];
17
+ StringBuilder result = new StringBuilder ();
18
+ for (char c : chars ) {
19
+ int idx = c - 'a' ;
20
+ counter [c - 'a' ]--;
21
+ if (added [idx ]) {
22
+ continue ;
23
+ }
24
+ while (!result .isEmpty () && result .charAt (result .length () - 1 ) > c ) {
25
+ int lastIdx = result .charAt (result .length () - 1 ) - 'a' ;
26
+ if (counter [lastIdx ] == 0 ) {
27
+ break ;
28
+ }
29
+ result .deleteCharAt (result .length () - 1 );
30
+ added [lastIdx ] = false ;
31
+ }
32
+ result .append (c );
33
+ added [idx ] = true ;
34
+ }
35
+ return result .toString ();
36
+ }
37
+ // end::answer[]
38
+ }
You can’t perform that action at this time.
0 commit comments