File tree Expand file tree Collapse file tree 6 files changed +101
-56
lines changed
src/main/java/com/diguage/algo/leetcode Expand file tree Collapse file tree 6 files changed +101
-56
lines changed Original file line number Diff line number Diff line change @@ -7592,14 +7592,14 @@ TIP: **公众号的微信号是: `jikerizhi`**。__因为众所周知的原因
7592
7592
//|{doc_base_url}/1080-insufficient-nodes-in-root-to-leaf-paths.adoc[题解]
7593
7593
//|Medium
7594
7594
//|
7595
- //
7596
- // |{counter:codes}
7597
- // |{leetcode_base_url}/smallest-subsequence-of-distinct-characters/[1081. Smallest Subsequence of Distinct Characters^]
7598
- // |{source_base_url}/_1081_SmallestSubsequenceOfDistinctCharacters.java[Java]
7599
- // |{doc_base_url}/1081-smallest-subsequence-of-distinct-characters.adoc[题解]
7600
- // |Medium
7601
- // |
7602
- //
7595
+
7596
+ |{counter:codes}
7597
+ |{leetcode_base_url}/smallest-subsequence-of-distinct-characters/[1081. Smallest Subsequence of Distinct Characters^]
7598
+ |{source_base_url}/_1081_SmallestSubsequenceOfDistinctCharacters.java[Java]
7599
+ |{doc_base_url}/1081-smallest-subsequence-of-distinct-characters.adoc[题解]
7600
+ |Medium
7601
+ |
7602
+
7603
7603
//|{counter:codes}
7604
7604
//|{leetcode_base_url}/sales-analysis-i/[1082. Sales Analysis I^]
7605
7605
//|{source_base_url}/_1082_SalesAnalysisI.java[Java]
Original file line number Diff line number Diff line change @@ -26,7 +26,9 @@ https://leetcode.cn/problems/remove-duplicate-letters/[LeetCode - 316. 去除重
26
26
27
27
== 思路分析
28
28
29
- 先遍历字符串,统计每个字符的出现次数。
29
+ 先遍历字符串,统计每个字符的出现次数。然后依次添加,遇到当前字符小于上次字符时,在上次字符在剩余字符串中还有时,则将上述字符“弹出”。循环弹出,直到循环结束。添加当前字符,记录添加状态。
30
+
31
+ 注意,在遍历字符时,向前走一步,则当前字符的次数就要减一。
30
32
31
33
[[src-0316]]
32
34
[tabs]
Original file line number Diff line number Diff line change 1
1
[#1081-smallest-subsequence-of-distinct-characters]
2
- = 1081. Smallest Subsequence of Distinct Characters
2
+ = 1081. 不同字符的最小子序列
3
3
4
- { leetcode} /problems/smallest-subsequence-of-distinct-characters/[LeetCode - Smallest Subsequence of Distinct Characters ^]
4
+ https:// leetcode.cn /problems/smallest-subsequence-of-distinct-characters/[LeetCode - 1081. 不同字符的最小子序列 ^]
5
5
6
- Return the lexicographically smallest subsequence of `text` that contains all the distinct characters of `text` exactly once.
6
+ 返回 `s` 字典序最小的子序列,该子序列包含 `s` 的所有不同字符,且只包含一次。
7
7
8
-
8
+ *示例 1:*
9
9
10
- *Example 1:*
10
+ ....
11
+ 输入:s = "bcabc"
12
+ 输出:"abc"
13
+ ....
11
14
12
- [subs="verbatim,quotes,macros"]
13
- ----
14
- *Input:* "cdadabcc"
15
- *Output:* "adbc"
16
- ----
15
+ *示例 2:*
17
16
17
+ ....
18
+ 输入:s = "cbacdcbc"
19
+ 输出:"acdb"
20
+ ....
18
21
19
- *Example 2: *
22
+ *提示: *
20
23
21
- [subs="verbatim,quotes,macros"]
22
- ----
23
- *Input:* "abcd"
24
- *Output:* "abcd"
25
- ----
24
+ * `+1 <= s.length <= 1000+`
25
+ * `s` 由小写英文字母组成
26
26
27
+ **注意:** 该题与 xref:0316-remove-duplicate-letters.adoc[316. Remove Duplicate Letters] 相同
27
28
28
- *Example 3:*
29
29
30
- [subs="verbatim,quotes,macros"]
31
- ----
32
- *Input:* "ecbacba"
33
- *Output:* "eacb"
34
- ----
30
+ == 思路分析
35
31
32
+ 该题与 xref:0316-remove-duplicate-letters.adoc[316. Remove Duplicate Letters] 相同,不再赘述。
36
33
37
- *Example 4:*
38
-
39
- [subs="verbatim,quotes,macros"]
34
+ [[src-1081]]
35
+ [tabs]
36
+ ====
37
+ 一刷::
38
+ +
39
+ --
40
+ [{java_src_attr}]
40
41
----
41
- *Input:* "leetcode"
42
- *Output:* "letcod"
42
+ include::{sourcedir}/_1081_SmallestSubsequenceOfDistinctCharacters.java[tag=answer]
43
43
----
44
+ --
44
45
45
-
46
-
47
- *Note:*
46
+ // 二刷::
47
+ // +
48
+ // --
49
+ // [{java_src_attr}]
50
+ // ----
51
+ // include::{sourcedir}/_1081_SmallestSubsequenceOfDistinctCharacters_2.java[tag=answer]
52
+ // ----
53
+ // --
54
+ ====
48
55
49
56
50
- . `1 <= text.length <= 1000`
51
- . `text` consists of lowercase English letters.
57
+ == 参考资料
52
58
53
59
54
-
55
-
56
-
57
-
58
-
59
-
60
- [[src-1081]]
61
- [{java_src_attr}]
62
- ----
63
- include::{sourcedir}/_1081_SmallestSubsequenceOfDistinctCharacters.java[tag=answer]
64
- ----
65
-
Original file line number Diff line number Diff line change @@ -2244,7 +2244,7 @@ include::1041-robot-bounded-in-circle.adoc[leveloffset=+1]
2244
2244
2245
2245
// include::1080-insufficient-nodes-in-root-to-leaf-paths.adoc[leveloffset=+1]
2246
2246
2247
- // include::1081-smallest-subsequence-of-distinct-characters.adoc[leveloffset=+1]
2247
+ include::1081-smallest-subsequence-of-distinct-characters.adoc[leveloffset=+1]
2248
2248
2249
2249
// include::1082-sales-analysis-i.adoc[leveloffset=+1]
2250
2250
Original file line number Diff line number Diff line change @@ -65,7 +65,7 @@ endif::[]
65
65
66
66
|{counter:codes2503}
67
67
|{leetcode_base_url} /remove-duplicate-letters/[316. 去除重复字母^]
68
- |{doc_base_url} /316. 去除重复字母 [题解]
68
+ |{doc_base_url} /0316-remove-duplicate-letters.adoc [题解]
69
69
|❌ 完全想不到单调栈!
70
70
71
71
|{counter:codes2503}
@@ -428,11 +428,15 @@ endif::[]
428
428
|{doc_base_url} /0128-longest-consecutive-sequence.adoc[题解]
429
429
|⭕️ 最初思路是排序。看答案,可以构建集合,然后“起点”(没有前一个数字)数字开始统计。
430
430
431
- |{counter:codes }
431
+ |{counter:codes2503 }
432
432
|{leetcode_base_url} /design-linked-list/[707. 设计链表^]
433
433
|{doc_base_url} /0707-design-linked-list.adoc[题解]
434
434
|✅
435
435
436
+ |{counter:codes2503}
437
+ |{leetcode_base_url} /smallest-subsequence-of-distinct-characters/[1081. 不同字符的最小子序列^]
438
+ |{doc_base_url} /1081-smallest-subsequence-of-distinct-characters.adoc[题解]
439
+ |❌ 单调栈,与 {doc_base_url} /0316-remove-duplicate-letters.adoc[316. Remove Duplicate Letters] 相同。知道用单调栈,但还是没写出来。
436
440
437
441
|===
438
442
Original file line number Diff line number Diff line change
1
+ package com .diguage .algo .leetcode ;
2
+
3
+ public class _1081_SmallestSubsequenceOfDistinctCharacters {
4
+ // tag::answer[]
5
+
6
+ /**
7
+ * @author D瓜哥 · https://www.diguage.com
8
+ * @since 2025-04-22 16:54:12
9
+ */
10
+ public String smallestSubsequence (String s ) {
11
+ char [] chars = s .toCharArray ();
12
+ int [] counts = new int [26 ];
13
+ for (char c : chars ) {
14
+ counts [c - 'a' ]++;
15
+ }
16
+ boolean [] used = new boolean [26 ];
17
+ StringBuilder sb = new StringBuilder (26 );
18
+ for (char c : chars ) {
19
+ int idx = c - 'a' ;
20
+ counts [idx ]--;
21
+ if (used [idx ]) {
22
+ continue ;
23
+ }
24
+ while (!sb .isEmpty ()
25
+ && sb .charAt (sb .length () - 1 ) > c ) {
26
+ int lastIndex = sb .length () - 1 ;
27
+ int tid = sb .charAt (lastIndex ) - 'a' ;
28
+ if (counts [tid ] == 0 ) {
29
+ break ;
30
+ } else {
31
+ sb .deleteCharAt (lastIndex );
32
+ used [tid ] = false ;
33
+ }
34
+ }
35
+ sb .append (c );
36
+ used [idx ] = true ;
37
+ }
38
+ return sb .toString ();
39
+ }
40
+ // end::answer[]
41
+ public static void main (String [] args ) {
42
+ new _1081_SmallestSubsequenceOfDistinctCharacters ()
43
+ .smallestSubsequence ("bcabc" );
44
+ }
45
+ }
You can’t perform that action at this time.
0 commit comments