思路:貪心,迷之棧用法,對於字元,肯定是把小的字元排在前面,因此可以用棧來記錄串,用pre記錄a-z出現的最後位置,
將第乙個字元s[0]入棧,遍歷字串s:若字元s[i]已入棧,則不做處理;若還沒入棧,則對s[i]與棧頂字元比較:
若s[i]比棧頂字元大,則直接入棧,若s[i]比棧頂字元小,按照貪心應該考慮將s[i]放在前面,因此判斷棧頂元素在s[i]後面是否還有,若有則將棧頂元素出棧,如此反覆比較,直到棧頂字元小於s[i]或s[i]後面沒有為止,再將s[i]入棧,這樣的棧中字串即為所求子串行。
code :
#include#include#includeusing namespace std;
string str;
stacksta;
vectorans;
int pre[30];
bool boo[30];
int main()
else break;
}sta.push(str[i]);
boo[str[i]-'a']=true;
} while(!sta.empty())
for(int i=ans.size()-1;i>=0;--i)
cout<
cout<
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...