Skip to content

Commit 0d7fb1c

Browse files
committed
feat: add solutions to lc problem: No.0791
No.0791.Custom Sort String
1 parent 07c5674 commit 0d7fb1c

File tree

7 files changed

+138
-122
lines changed

7 files changed

+138
-122
lines changed

solution/0100-0199/0123.Best Time to Buy and Sell Stock III/README.md

+11-4
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,20 @@
5959

6060
<!-- 这里可写通用的实现逻辑 -->
6161

62-
动态规划法。
62+
**方法一:动态规划**
6363

64-
设 f1 表示第 1 次买入股票后的最大利润,f2 表示第 1 次卖出股票后的最大利润,f3 表示第 2 次买入股票后的最大利润,f4 表示第 2 次卖出股票后的最大利润。
64+
我们定义以下几个变量,其中:
6565

66-
遍历过程中,直接使用 f1, f2, f3, f4 计算,考虑的是在同一天买入和卖出时,收益是 0,不会对答案产生影响。
66+
- `f1` 表示第一次买入股票后的最大利润;
67+
- `f2` 表示第一次卖出股票后的最大利润;
68+
- `f3` 表示第二次买入股票后的最大利润;
69+
- `f4` 表示第二次卖出股票后的最大利润。
6770

68-
最后返回 f2 即可。
71+
遍历过程中,直接使用 `f1`, `f2`, `f3`, `f4` 计算,考虑的是在同一天买入和卖出时,收益是 $0$,不会对答案产生影响。
72+
73+
最后返回 `f2` 即可。
74+
75+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 `prices` 的长度。
6976

7077
<!-- tabs:start -->
7178

solution/0700-0799/0791.Custom Sort String/README.md

+57-48
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,19 @@
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

48-
**方法一:哈希表 + 自定义排序**
48+
**方法一:自定义排序**
4949

50-
将字符串中的字符按照 $order$ 中出现的位置(下标)排序,未在 $order$ 中出现的,下标默认视为 $-1$。
50+
一种比较直接的思路是,用哈希表或数组 $d$ 记录字符串 $order$ 中每个字符的位置,然后对字符串 $s$ 中每个字符按照其在 $d$ 中的位置进行排序。如果某个字符不在 $d$ 中,我们可以将其位置置为 $0$。
5151

52-
时间复杂度 $O(nlogn+m)$,空间复杂度 $O(m)$其中 $m$ 和 $n$ 分别为 $order$ 和 $s$ 的长度。
52+
时间复杂度 $O(m + n\times \log n)$,空间复杂度 $O(m)$其中 $m$ 和 $n$ 分别是字符串 $order$ 和 $s$ 的长度。
5353

5454
**方法二:字符计数**
5555

56-
统计 $s$ 中每个字符的出现次数,存储在 $cnt$ 数组中。
56+
我们还可以先统计 $s$ 中每个字符的出现次数,存储在 $cnt$ 数组中。
5757

58-
然后把在 $order$ 中出现的字符按照 $order$ 中的顺序排序,剩余字符添加到当前字符串的后面
58+
然后把字符串 $s$ 在 $order$ 中出现的字符按照 $order$ 中的顺序排序,添加到结果字符串中。然后把剩余的字符直接追加到结果字符串中
5959

60-
时间复杂度 $O(m+n)$,其中 $m$ 和 $n$ 分别为 $order$ 和 $s$ 的长度。空间复杂度 $O(n)$
60+
时间复杂度 $O(m+n)$,空间复杂度 $O(m)$。其中 $m$ 和 $n$ 分别是字符串 $order$ 和 $s$ 的长度。
6161

6262
<!-- tabs:start -->
6363

@@ -68,10 +68,8 @@
6868
```python
6969
class Solution:
7070
def customSortString(self, order: str, s: str) -> str:
71-
cs = list(s)
72-
m = {v: i for i, v in enumerate(order)}
73-
cs.sort(key=lambda x: m.get(x, -1))
74-
return ''.join(cs)
71+
d = {c: i for i, c in enumerate(order)}
72+
return ''.join(sorted(s, key=lambda x: d.get(x, 0)))
7573
```
7674

7775
```python
@@ -80,11 +78,10 @@ class Solution:
8078
cnt = Counter(s)
8179
ans = []
8280
for c in order:
83-
ans.append(cnt[c] * c)
84-
cnt[c] = 0
85-
for c in s:
86-
ans.append(cnt[c] * c)
81+
ans.append(c * cnt[c])
8782
cnt[c] = 0
83+
for c, v in cnt.items():
84+
ans.append(c * v)
8885
return ''.join(ans)
8986
```
9087

@@ -95,20 +92,16 @@ class Solution:
9592
```java
9693
class Solution {
9794
public String customSortString(String order, String s) {
98-
Map<Character, Integer> m = new HashMap<>();
95+
int[] d = new int[26];
9996
for (int i = 0; i < order.length(); ++i) {
100-
m.put(order.charAt(i), i);
97+
d[order.charAt(i) - 'a'] = i;
10198
}
10299
List<Character> cs = new ArrayList<>();
103-
for (char c : s.toCharArray()) {
104-
cs.add(c);
105-
}
106-
cs.sort((a, b) -> m.getOrDefault(a, -1) - m.getOrDefault(b, -1));
107-
StringBuilder ans = new StringBuilder();
108-
for (char c : cs) {
109-
ans.append(c);
100+
for (int i = 0; i < s.length(); ++i) {
101+
cs.add(s.charAt(i));
110102
}
111-
return ans.toString();
103+
cs.sort((a, b) -> d[a - 'a'] - d[b - 'a']);
104+
return cs.stream().map(String::valueOf).collect(Collectors.joining());
112105
}
113106
}
114107
```
@@ -117,18 +110,19 @@ class Solution {
117110
class Solution {
118111
public String customSortString(String order, String s) {
119112
int[] cnt = new int[26];
120-
for (char c : s.toCharArray()) {
121-
++cnt[c - 'a'];
113+
for (int i = 0; i < s.length(); ++i) {
114+
++cnt[s.charAt(i) - 'a'];
122115
}
123116
StringBuilder ans = new StringBuilder();
124-
for (char c : order.toCharArray()) {
117+
for (int i = 0; i < order.length(); ++i) {
118+
char c = order.charAt(i);
125119
while (cnt[c - 'a']-- > 0) {
126120
ans.append(c);
127121
}
128122
}
129-
for (char c : s.toCharArray()) {
130-
while (cnt[c - 'a']-- > 0) {
131-
ans.append(c);
123+
for (int i = 0; i < 26; ++i) {
124+
while (cnt[i]-- > 0) {
125+
ans.append((char) ('a' + i));
132126
}
133127
}
134128
return ans.toString();
@@ -142,19 +136,23 @@ class Solution {
142136
class Solution {
143137
public:
144138
string customSortString(string order, string s) {
145-
vector<int> cnt(26);
146-
for (char c : s) ++cnt[c - 'a'];
147-
string ans = "";
148-
for (char c : order) {
149-
while (cnt[c - 'a']-- > 0) {
150-
ans += c;
151-
}
152-
}
153-
for (char c : s) {
154-
while (cnt[c - 'a']-- > 0) {
155-
ans += c;
156-
}
157-
}
139+
int d[26] = {0};
140+
for (int i = 0; i < order.size(); ++i) d[order[i] - 'a'] = i;
141+
sort(s.begin(), s.end(), [&](auto a, auto b) { return d[a - 'a'] < d[b - 'a']; });
142+
return s;
143+
}
144+
};
145+
```
146+
147+
```cpp
148+
class Solution {
149+
public:
150+
string customSortString(string order, string s) {
151+
int cnt[26] = {0};
152+
for (char& c : s) ++cnt[c - 'a'];
153+
string ans;
154+
for (char& c : order) while (cnt[c - 'a']-- > 0) ans += c;
155+
for (int i = 0; i < 26; ++i) if (cnt[i] > 0) ans += string(cnt[i], i + 'a');
158156
return ans;
159157
}
160158
};
@@ -164,7 +162,19 @@ public:
164162

165163
```go
166164
func customSortString(order string, s string) string {
167-
cnt := make([]int, 26)
165+
d := [26]int{}
166+
for i := range order {
167+
d[order[i]-'a'] = i
168+
}
169+
cs := []byte(s)
170+
sort.Slice(cs, func(i, j int) bool { return d[cs[i]-'a'] < d[cs[j]-'a'] })
171+
return string(cs)
172+
}
173+
```
174+
175+
```go
176+
func customSortString(order string, s string) string {
177+
cnt := [26]int{}
168178
for _, c := range s {
169179
cnt[c-'a']++
170180
}
@@ -175,10 +185,9 @@ func customSortString(order string, s string) string {
175185
cnt[c-'a']--
176186
}
177187
}
178-
for _, c := range s {
179-
for cnt[c-'a'] > 0 {
180-
ans = append(ans, c)
181-
cnt[c-'a']--
188+
for i, v := range cnt {
189+
for j := 0; j < v; j++ {
190+
ans = append(ans, rune('a'+i))
182191
}
183192
}
184193
return string(ans)

solution/0700-0799/0791.Custom Sort String/README_EN.md

+51-42
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,8 @@ Since &quot;d&quot; does not appear in order, it can be at any position in the r
4747
```python
4848
class Solution:
4949
def customSortString(self, order: str, s: str) -> str:
50-
cs = list(s)
51-
m = {v: i for i, v in enumerate(order)}
52-
cs.sort(key=lambda x: m.get(x, -1))
53-
return ''.join(cs)
50+
d = {c: i for i, c in enumerate(order)}
51+
return ''.join(sorted(s, key=lambda x: d.get(x, 0)))
5452
```
5553

5654
```python
@@ -59,11 +57,10 @@ class Solution:
5957
cnt = Counter(s)
6058
ans = []
6159
for c in order:
62-
ans.append(cnt[c] * c)
63-
cnt[c] = 0
64-
for c in s:
65-
ans.append(cnt[c] * c)
60+
ans.append(c * cnt[c])
6661
cnt[c] = 0
62+
for c, v in cnt.items():
63+
ans.append(c * v)
6764
return ''.join(ans)
6865
```
6966

@@ -72,20 +69,16 @@ class Solution:
7269
```java
7370
class Solution {
7471
public String customSortString(String order, String s) {
75-
Map<Character, Integer> m = new HashMap<>();
72+
int[] d = new int[26];
7673
for (int i = 0; i < order.length(); ++i) {
77-
m.put(order.charAt(i), i);
74+
d[order.charAt(i) - 'a'] = i;
7875
}
7976
List<Character> cs = new ArrayList<>();
80-
for (char c : s.toCharArray()) {
81-
cs.add(c);
82-
}
83-
cs.sort((a, b) -> m.getOrDefault(a, -1) - m.getOrDefault(b, -1));
84-
StringBuilder ans = new StringBuilder();
85-
for (char c : cs) {
86-
ans.append(c);
77+
for (int i = 0; i < s.length(); ++i) {
78+
cs.add(s.charAt(i));
8779
}
88-
return ans.toString();
80+
cs.sort((a, b) -> d[a - 'a'] - d[b - 'a']);
81+
return cs.stream().map(String::valueOf).collect(Collectors.joining());
8982
}
9083
}
9184
```
@@ -94,18 +87,19 @@ class Solution {
9487
class Solution {
9588
public String customSortString(String order, String s) {
9689
int[] cnt = new int[26];
97-
for (char c : s.toCharArray()) {
98-
++cnt[c - 'a'];
90+
for (int i = 0; i < s.length(); ++i) {
91+
++cnt[s.charAt(i) - 'a'];
9992
}
10093
StringBuilder ans = new StringBuilder();
101-
for (char c : order.toCharArray()) {
94+
for (int i = 0; i < order.length(); ++i) {
95+
char c = order.charAt(i);
10296
while (cnt[c - 'a']-- > 0) {
10397
ans.append(c);
10498
}
10599
}
106-
for (char c : s.toCharArray()) {
107-
while (cnt[c - 'a']-- > 0) {
108-
ans.append(c);
100+
for (int i = 0; i < 26; ++i) {
101+
while (cnt[i]-- > 0) {
102+
ans.append((char) ('a' + i));
109103
}
110104
}
111105
return ans.toString();
@@ -119,19 +113,23 @@ class Solution {
119113
class Solution {
120114
public:
121115
string customSortString(string order, string s) {
122-
vector<int> cnt(26);
123-
for (char c : s) ++cnt[c - 'a'];
124-
string ans = "";
125-
for (char c : order) {
126-
while (cnt[c - 'a']-- > 0) {
127-
ans += c;
128-
}
129-
}
130-
for (char c : s) {
131-
while (cnt[c - 'a']-- > 0) {
132-
ans += c;
133-
}
134-
}
116+
int d[26] = {0};
117+
for (int i = 0; i < order.size(); ++i) d[order[i] - 'a'] = i;
118+
sort(s.begin(), s.end(), [&](auto a, auto b) { return d[a - 'a'] < d[b - 'a']; });
119+
return s;
120+
}
121+
};
122+
```
123+
124+
```cpp
125+
class Solution {
126+
public:
127+
string customSortString(string order, string s) {
128+
int cnt[26] = {0};
129+
for (char& c : s) ++cnt[c - 'a'];
130+
string ans;
131+
for (char& c : order) while (cnt[c - 'a']-- > 0) ans += c;
132+
for (int i = 0; i < 26; ++i) if (cnt[i] > 0) ans += string(cnt[i], i + 'a');
135133
return ans;
136134
}
137135
};
@@ -141,7 +139,19 @@ public:
141139

142140
```go
143141
func customSortString(order string, s string) string {
144-
cnt := make([]int, 26)
142+
d := [26]int{}
143+
for i := range order {
144+
d[order[i]-'a'] = i
145+
}
146+
cs := []byte(s)
147+
sort.Slice(cs, func(i, j int) bool { return d[cs[i]-'a'] < d[cs[j]-'a'] })
148+
return string(cs)
149+
}
150+
```
151+
152+
```go
153+
func customSortString(order string, s string) string {
154+
cnt := [26]int{}
145155
for _, c := range s {
146156
cnt[c-'a']++
147157
}
@@ -152,10 +162,9 @@ func customSortString(order string, s string) string {
152162
cnt[c-'a']--
153163
}
154164
}
155-
for _, c := range s {
156-
for cnt[c-'a'] > 0 {
157-
ans = append(ans, c)
158-
cnt[c-'a']--
165+
for i, v := range cnt {
166+
for j := 0; j < v; j++ {
167+
ans = append(ans, rune('a'+i))
159168
}
160169
}
161170
return string(ans)
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,11 @@
11
class Solution {
22
public:
33
string customSortString(string order, string s) {
4-
vector<int> cnt(26);
5-
for (char c : s) ++cnt[c - 'a'];
6-
string ans = "";
7-
for (char c : order) {
8-
while (cnt[c - 'a']-- > 0) {
9-
ans += c;
10-
}
11-
}
12-
for (char c : s) {
13-
while (cnt[c - 'a']-- > 0) {
14-
ans += c;
15-
}
16-
}
4+
int cnt[26] = {0};
5+
for (char& c : s) ++cnt[c - 'a'];
6+
string ans;
7+
for (char& c : order) while (cnt[c - 'a']-- > 0) ans += c;
8+
for (int i = 0; i < 26; ++i) if (cnt[i] > 0) ans += string(cnt[i], i + 'a');
179
return ans;
1810
}
1911
};

0 commit comments

Comments
 (0)