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

2021-07-24 11:58:38 字數 986 閱讀 6696

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

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

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

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

一開始看到這題就有乙個思路:如果現在找出來的答案末尾是x,找到了乙個字元y,那麼如果y比x要小,y後面還有x存在,那麼就用y去替換掉x。

搞了好久之後,發現這個有問題啊!!!

看了看題解之後,發現題解與我的想法很像,但是我的想法還是有一點漏洞:找在答案末尾一直找,直到不能替換為止,所以要打乙個棧。

然後棧從下到上就是答案。

#include

#include

#include

#include

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

#define fod(i,a,b) for(i=a;i>=b;i--)

using

namespace

std;

const

int maxn=100007;

int i,j,k,n,m,ans;

int hou[maxn][26];

char s[maxn],ans1[100],ch;

bool bz[26];

stack

t;int main()

hou[i][s[i]-'a']++;

}fo(i,1,n)

if(!bz[s[i]-'a'])t.push(s[i]),bz[s[i]-'a']=1;

}

}while(!t.empty())ans1[++ans]=t.top(),t.pop();

fod(i,ans,1)putchar(ans1[i]);

}

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

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

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

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

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

思路 貪心,迷之棧用法,對於字元,肯定是把小的字元排在前面,因此可以用棧來記錄串,用pre記錄a z出現的最後位置,將第乙個字元s 0 入棧,遍歷字串s 若字元s i 已入棧,則不做處理 若還沒入棧,則對s i 與棧頂字元比較 若s i 比棧頂字元大,則直接入棧,若s i 比棧頂字元小,按照貪心應該...