刪除多餘的字元得到字典序最小的字串

2021-10-14 08:37:46 字數 1388 閱讀 4686

刪除多餘的字元得到字典序最小的字串

給乙個全是小寫字母的字串str,刪除多餘字元,使得每種字元只保留乙個,並且讓最終結果字串字典序最小。

輸入描述:

輸入包含一行字串,代表str

(1≤l

engt

hstr

≤105

)str(1 \leq length_ \leq 10^5)

str(1≤

leng

thst

r​≤1

05)。

輸出描述:

輸出一行,代表刪除後的字串。

示例1輸入

acbc
輸出
abc
示例2

輸入

dbcacbca
輸出
dabc
備註:

時間複雜度o(n

)o(n)

o(n)

,額外空間複雜度o(1

)o(1)

o(1)

。題解:

棧+貪心。首先思考乙個簡單的問題:給定乙個字串 s ,如何去掉其中的一次字元 ch ,使得得到的字串字典序最小呢?答案是:找出最小的滿足 s[i

]>s[

i+1]

s[i] > s[i+1]

s[i]

>s[

i+1]

的下標 i ,並去除 s[i] 。這樣的字元稱為 「關鍵字元」。

於是我們有乙個直觀思路:在 s 中找到「關鍵字元」並去除它,然後不斷進行這樣的迴圈。

於是我們可以使用單調棧,維護從棧頂到棧底嚴格單調遞增的順序。

但是,題目中還要求:原字串 s 中的每個字元都需要出現在新字串中,且只能出現一次。可以作出以下兩點更改:

**:

#include

#include

#include

using

namespace std;

const

int n =

100001

;const

int m =26;

char str[n]

;int nums[m]

;char ret[m]

;bool vis[m]

;int

main

(void

) ret[

++top]

= str[i]

; vis[str[i]

-'a']=

true;}

ret[

++top]=0

;puts

(ret)

;return0;

}

刪除多餘的字元得到字典序最小的字串

給乙個全是小寫字母的字串str,刪除多餘字元,使得每種字元只保留乙個,並且讓最終結果字串字典序最小。輸入包含一行字串,代表str 1 length str 10 5 輸出一行,代表刪除後的字串。示例1 acbcabcdbcacbcadabc時間複雜度o n 額外空間複雜度o 1 o n k k 26...

最小的字典序

題目 給定乙個字串型別的陣列strs,找到一種拼接方式,使得把所有字 符串拼起來之後形成的字串具有最低的字典序。如 ab cd ef 則拼接後的最低字典序是 abcdef 這裡重點是選擇什麼樣的貪心策略 public class dictsort public static string lowes...

字典序最小的最短路

給出n和m,有n個點,m條雙向邊,1為起點,n為終點,每條邊都有乙個權值,經過每一條邊的時間都為1,求從起點到終點既要時間最少,又要權值組成的序列的字典序最小的一條路徑.4 6 1 2 1 1 3 2 3 4 3 2 3 1 2 4 4 3 1 1 2 1 3 50 n 100 100 n 1000...