Skip to content

Commit 86d2f0f

Browse files
committed
update: 316
1 parent 0ac110b commit 86d2f0f

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ This is the solutions collection of my LeetCode submissions, most of them are pr
135135
| 309 | [Best Time to Buy and Sell Stock with Cooldown](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/) | [JavaScript](./src/best-time-to-buy-and-sell-stock-with-cooldown/res.js) | Medium |
136136
| 310 | [Minimum Height Trees](https://leetcode.com/problems/minimum-height-trees/) | [JavaScript](./src/minimum-height-trees/res.js) | Medium |
137137
| 315 | [Count of Smaller Numbers After Self](https://leetcode.com/problems/count-of-smaller-numbers-after-self/) <sup>*</sup> | [JavaScript](./src/count-of-smaller-numbers-after-self/res.js) | Hard |
138+
| 316 | [remove-duplicate-letters](https://leetcode.com/problems/remove-duplicate-letters/) | [TypeScript](./src/remove-duplicate-letters/res.ts) | Medium |
138139
| 322 | [Coin Change](https://leetcode.com/problems/coin-change/) | [JavaScript](./src/coin-change/res.js) | Medium |
139140
| 327 | [Count of Range Sum](https://leetcode.com/problems/count-of-range-sum/) | [JavaScript](./src/count-of-range-sum/res.js) | Hard |
140141
| 334 | [Increasing Triplet Subsequence](https://leetcode.com/problems/increasing-triplet-subsequence/) | [JavaScript](./src/increasing-triplet-subsequence/res.js) | Medium |

src/remove-duplicate-letters/res.ts

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
function removeDuplicateLetters(s: string): string {
2+
if (s.length <= 1) {
3+
return s;
4+
}
5+
6+
const sList = s.split('');
7+
const sCountMap: { [key in string]: number } = {};
8+
sList.map(str => {
9+
sCountMap[str] = sCountMap[str] ? sCountMap[str]+1 : 1;
10+
});
11+
12+
const remainCountMap: { [key in string]: number } = JSON.parse(JSON.stringify(sCountMap));
13+
const resultCountMap: { [key in string]: number } = {};
14+
15+
Object.keys(sCountMap).forEach(key => resultCountMap[key] = 0);
16+
const sStack = [sList[0]];
17+
resultCountMap[sList[0]] = 1;
18+
remainCountMap[sList[0]] -= 1;
19+
20+
for (let i = 1; i < sList.length; i++) {
21+
const element = sList[i];
22+
const prevElement = sStack[sStack.length-1];
23+
if (!resultCountMap[element] && element > prevElement) {
24+
sStack.push(element);
25+
remainCountMap[element] -= 1;
26+
resultCountMap[element] = 1;
27+
} else if (!resultCountMap[element] && element < prevElement) {
28+
let currentIndex = sStack.length-1;
29+
while(currentIndex >= 0) {
30+
const currentPrevElement = sStack[currentIndex];
31+
if (currentPrevElement > element && remainCountMap[currentPrevElement]) {
32+
currentIndex--;
33+
} else {
34+
break;
35+
}
36+
}
37+
const sStackLength = sStack.length;
38+
for (let j = currentIndex+1; j < sStackLength; j++) {
39+
const minusElement = sStack.pop() as string;
40+
resultCountMap[minusElement]--;
41+
}
42+
sStack.push(element);
43+
remainCountMap[element]--;
44+
resultCountMap[element]++;
45+
} else {
46+
remainCountMap[element]--;
47+
}
48+
}
49+
50+
return sStack.join('');
51+
};

0 commit comments

Comments
 (0)