説明
文字列sを指定して、重複する文字を削除し、すべての文字が1回だけ表示されるようにします。結果が、考えられるすべての結果の中で辞書式順序で最小であることを確認する必要があります。
注:この質問は1081と同じです:https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/
例1:
Input: s = "bcabc"
Output: "abc"
例2:
Input: s = "cbacdcbc"
Output: "acdb"
制約:
- 1 <= s.length <= 104
- sは小文字の英字で構成されます。
分析
質問の意味は次のとおりです。文字列を指定し、繰り返しのない文字を削除します。元の相対位置を乱さない限り、結果をアルファベット順に並べる必要があります。
この質問では、スタックを使用して実装する必要があるリートコード1081のプラクティスを参照します。各文字の最後の位置は、最後の辞書に格納されます。
- sをトラバースするときに、トラバースされた文字がスタック内の文字よりも小さい場合は、スタック内の要素が終了位置に到達したかどうかによって異なります。この時点で、最後の辞書を使用して判断できます。到達した場合、スタックをポップすることはできません。;到達しない場合は、スタックからポップアウトします。
- スタックに登場したキャラクターはスキップしてください。
- 最後に、スタック内の要素をスプライスするだけです。
コード
class Solution:
def removeDuplicateLetters(self, s: str) -> str:
last=defaultdict(int)
for i in range(len(s)):
last[s[i]]=i
stack=[]
for i,ch in enumerate(s):
if(ch in stack):
continue
while(stack and stack[-1]>ch and i<last[stack[-1]]):
stack.pop()
stack.append(ch)
return ''.join(stack)