1255 字典序最小的子串行

2021-08-04 03:12:04 字數 1551 閱讀 2665

1255 字典序最小的子串行

天津大學oj

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

給出乙個由a-z組成的字串s,求他的乙個子串行,滿足如下條件:

1、包含字串中所有出現過的字元各1個。

2、是所有滿足條件1的串中,字典序最小的。

例如:babbdcc,出現過的字元為:abcd,而包含abcd的所有子串行中,字典序最小的為abdc。

input

輸入1行字串s,所有字元均為小寫,字串的長度為l。(1 <= l <= 100000)。
output

輸出包含s中所有出現過的字元,每個字元各1個,並且字典序最小的s的子串行。
input示例

babbdcc
output示例

abdc

李陶冶(題目提供者)

c++的執行時限為:1000 ms ,空間限制為:131072 kb 

示例及語言說明請按這裡

解題思路:遍歷每乙個字母時,以此字母為基準繼續向後遍歷看是否有比其跟小的字母,如果有的話就替換,若沒有就不替換。

具體操作請看**。

法一:

#include using namespace std;

int main ()

; //用來統計每個字母的個數

for (int i=0; i0)

next[s[j]-'a']--;

if(next[s[j]-'a']<1)//遍歷途中有字母已經沒有了,就必須跳出此次遍歷。

break;

}j++;

}char cc=t[t.size()-1];

f[t[t.size()-1]-'a']=1;

for (int j=i; j<=id; j++)

num[s[j]-'a']--;

i=id;}}

cout<

法二《用stack>:

#include #include #include #include #include #include using namespace std;

const int n =100001;

int main()

queue1.push(str[i]);

vis[str[i]-'a']=1;

}string str1="";

while(!queue1.empty())

cout<

法三《用雙向佇列deque>:

#include #include #include #include #include using namespace std;

const int n =100001;

int main()

deque1.push_back(str[i]);

vis[str[i]-'a']=1;

}while(!deque1.empty())

printf("\n");

}return 0;

}

51Nod 1255 字典序最小的子串行

acm模版 這道題大致思路不難,但是細節問題頗多,用兩種方法解題。第一種,遍歷原串,如果答案串中沒有則往答案串中插入,如果答案串中第i個等於它,並且該字母往後查有第j個比他小,並且保證i和j之間的字母在原串中依然存在 保證可以被替換掉 則刪除第i個,後續向前遷移1,並在結尾處插入該字母。第二種是利用...

51Nod 1255 字典序最小的子串行

給出乙個由a z組成的字串s,求他的乙個子串行,滿足如下條件 1 包含字串中所有出現過的字元各1個。2 是所有滿足條件1的串中,字典序最小的。例如 babbdcc,出現過的字元為 abcd,而包含abcd的所有子串行中,字典序最小的為abdc。一開始看到這題就有乙個思路 如果現在找出來的答案末尾是x...

51 nod 1255 字典序最小的子串行

思路 分三種情況 1 棧空,直接將字母壓入。2 棧非空,當前字母大於棧頂元素,棧中未出現該字母,壓入棧。3 棧非空,當前字母小於棧頂元素,棧中未出現該字母,執行迴圈 棧頂元素大於當前字母,且後面還存在棧頂元素,彈出棧頂元素。最後壓入當前字母。include include include inclu...