Skip to content

Commit 588c8b1

Browse files
committed
一刷316
1 parent fd03eae commit 588c8b1

File tree

6 files changed

+101
-56
lines changed

6 files changed

+101
-56
lines changed

README.adoc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7592,14 +7592,14 @@ TIP: **公众号的微信号是: `jikerizhi`**。__因为众所周知的原因
75927592
//|{doc_base_url}/1080-insufficient-nodes-in-root-to-leaf-paths.adoc[题解]
75937593
//|Medium
75947594
//|
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+
76037603
//|{counter:codes}
76047604
//|{leetcode_base_url}/sales-analysis-i/[1082. Sales Analysis I^]
76057605
//|{source_base_url}/_1082_SalesAnalysisI.java[Java]

docs/0316-remove-duplicate-letters.adoc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ https://leetcode.cn/problems/remove-duplicate-letters/[LeetCode - 316. 去除重
2626
2727
== 思路分析
2828

29-
先遍历字符串,统计每个字符的出现次数。
29+
先遍历字符串,统计每个字符的出现次数。然后依次添加,遇到当前字符小于上次字符时,在上次字符在剩余字符串中还有时,则将上述字符“弹出”。循环弹出,直到循环结束。添加当前字符,记录添加状态。
30+
31+
注意,在遍历字符时,向前走一步,则当前字符的次数就要减一。
3032

3133
[[src-0316]]
3234
[tabs]
Lines changed: 38 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,59 @@
11
[#1081-smallest-subsequence-of-distinct-characters]
2-
= 1081. Smallest Subsequence of Distinct Characters
2+
= 1081. 不同字符的最小子序列
33

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. 不同字符的最小子序列 ^]
55

6-
Return the lexicographically smallest subsequence of `text` that contains all the distinct characters of `text` exactly once.
6+
返回 `s` 字典序最小的子序列,该子序列包含 `s` 的所有不同字符,且只包含一次。
77

8-
8+
*示例 1:*
99

10-
*Example 1:*
10+
....
11+
输入:s = "bcabc"
12+
输出:"abc"
13+
....
1114

12-
[subs="verbatim,quotes,macros"]
13-
----
14-
*Input:* "cdadabcc"
15-
*Output:* "adbc"
16-
----
15+
*示例 2:*
1716

17+
....
18+
输入:s = "cbacdcbc"
19+
输出:"acdb"
20+
....
1821

19-
*Example 2:*
22+
*提示:*
2023

21-
[subs="verbatim,quotes,macros"]
22-
----
23-
*Input:* "abcd"
24-
*Output:* "abcd"
25-
----
24+
* `+1 <= s.length <= 1000+`
25+
* `s` 由小写英文字母组成
2626
27+
**注意:**该题与 xref:0316-remove-duplicate-letters.adoc[316. Remove Duplicate Letters] 相同
2728

28-
*Example 3:*
2929

30-
[subs="verbatim,quotes,macros"]
31-
----
32-
*Input:* "ecbacba"
33-
*Output:* "eacb"
34-
----
30+
== 思路分析
3531

32+
该题与 xref:0316-remove-duplicate-letters.adoc[316. Remove Duplicate Letters] 相同,不再赘述。
3633

37-
*Example 4:*
38-
39-
[subs="verbatim,quotes,macros"]
34+
[[src-1081]]
35+
[tabs]
36+
====
37+
一刷::
38+
+
39+
--
40+
[{java_src_attr}]
4041
----
41-
*Input:* "leetcode"
42-
*Output:* "letcod"
42+
include::{sourcedir}/_1081_SmallestSubsequenceOfDistinctCharacters.java[tag=answer]
4343
----
44+
--
4445
45-
46-
47-
*Note:*
46+
// 二刷::
47+
// +
48+
// --
49+
// [{java_src_attr}]
50+
// ----
51+
// include::{sourcedir}/_1081_SmallestSubsequenceOfDistinctCharacters_2.java[tag=answer]
52+
// ----
53+
// --
54+
====
4855

4956

50-
. `1 <= text.length <= 1000`
51-
. `text` consists of lowercase English letters.
57+
== 参考资料
5258

5359

54-
55-
56-
57-
58-
59-
60-
[[src-1081]]
61-
[{java_src_attr}]
62-
----
63-
include::{sourcedir}/_1081_SmallestSubsequenceOfDistinctCharacters.java[tag=answer]
64-
----
65-

docs/index.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2244,7 +2244,7 @@ include::1041-robot-bounded-in-circle.adoc[leveloffset=+1]
22442244

22452245
// include::1080-insufficient-nodes-in-root-to-leaf-paths.adoc[leveloffset=+1]
22462246

2247-
// include::1081-smallest-subsequence-of-distinct-characters.adoc[leveloffset=+1]
2247+
include::1081-smallest-subsequence-of-distinct-characters.adoc[leveloffset=+1]
22482248

22492249
// include::1082-sales-analysis-i.adoc[leveloffset=+1]
22502250

logbook/202503.adoc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ endif::[]
6565

6666
|{counter:codes2503}
6767
|{leetcode_base_url}/remove-duplicate-letters/[316. 去除重复字母^]
68-
|{doc_base_url}/316. 去除重复字母[题解]
68+
|{doc_base_url}/0316-remove-duplicate-letters.adoc[题解]
6969
|❌ 完全想不到单调栈!
7070

7171
|{counter:codes2503}
@@ -428,11 +428,15 @@ endif::[]
428428
|{doc_base_url}/0128-longest-consecutive-sequence.adoc[题解]
429429
|⭕️ 最初思路是排序。看答案,可以构建集合,然后“起点”(没有前一个数字)数字开始统计。
430430

431-
|{counter:codes}
431+
|{counter:codes2503}
432432
|{leetcode_base_url}/design-linked-list/[707. 设计链表^]
433433
|{doc_base_url}/0707-design-linked-list.adoc[题解]
434434
|✅
435435

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] 相同。知道用单调栈,但还是没写出来。
436440

437441
|===
438442

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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+
}

0 commit comments

Comments
 (0)