刪除多餘的字元得到字典序最小的字串
給乙個全是小寫字母的字串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...