[LeetCode]RemoveDuplicateLetters解题思路

来源:互联网 发布:dreamweaver调试js 编辑:程序博客网 时间:2024/04/30 08:23

一、问题描述:

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.

Example:

Given "bcabc"
Return "abc"

Given "cbacdcbc"
Return "acdb"


https://leetcode.com/problems/remove-duplicate-letters/


二、问题分析:


    这是一道贪心的题目,重点在于贪心准则的选取。

    一开始用了倒序的方式扫描字符串,每次考虑扫描到的元素是否已加入结果栈中,如果未加入则将其加入,否则考虑它与栈顶元素的大小关系,如果它比栈顶元素小,则将其同样入栈,只不过在出栈的时候只出靠近栈顶的,后面的就不出了。这样的准则过于局部,虽然只有几个测试数据没有过,但还是需要重新考虑一下贪心准则。

    为了消除上面描述的过于局部问题,引入一个cnt数组记录所给字符串s中每个元素的出现次数,一个tag数组记录其是否已经加入栈中,并顺序扫描所给字符串,所选准则为:对于所给字符串s的每个字符s[i],判断其是否已经加入栈中,如果已经加入,则此次不再对其进行操作;否则,不断与栈顶元素比较,如果其小于栈顶元素并且栈顶元素的cnt[]>0,则可以将栈顶元素弹出,并将tag[]恢复为0因为以后还有机会将其继续入栈,而当前元素可以更好的替代它。


三、代码实现:


#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <string>#include <vector>#include <deque>#include <list>#include <set>#include <map>#include <stack>#include <queue>#include <numeric>#include <iomanip>#include <bitset>#include <sstream>#include <fstream>#define PI (acos(-1.0))#define EPS (1e-8)#define INF (1<<30)using namespace std;class Solution {public:    string removeDuplicateLetters(string s) {    stack<char> choose;    int tag[26] = {0}, cnt[26] = {0};    for (int i = 0; i < s.length(); ++i) cnt[s[i]-'a']++;        for (int i = 0; i < s.length(); ++i) {        int index = s[i]-'a';        cnt[index]--;        if (tag[index]) continue;        while (!choose.empty() && s[i]<choose.top() && cnt[choose.top()-'a']>0) {        tag[choose.top()-'a'] = 0;        choose.pop();        }        choose.push(s[i]);        tag[index] = 1;        }        string ans;        while (!choose.empty()) {        ans = choose.top()+ans;        choose.pop();        }         return ans;    }};int main(int argc, char const *argv[]) {Solution solu;string s;cin >> s;cout << solu.removeDuplicateLetters(s) << endl;return 0;}


0 0
原创粉丝点击