Leetcode 316. Remove Duplicate Letters

Problem:

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 1:

Input: "bcabc"
Output: "abc"

Example 2:

Input: "cbacdcbc"
Output: "acdb"

Solution:

  这道题提示我们用栈解决,但我仍然没想出来如何使用栈,看了别人的解答后发现这道题的栈不是常规的递增栈或递减栈。这里我们用了一个计数器count和visit数组判断是否使用过该字符。比如说”cbacdcbc“这个字符串,我们来解释下如何推出结果

1. cbacdcbc

    ^               

    result = "c"

2. cbacdcbc

      ^                //由于b比c小且b之后还有c,所以我们可以把c删去用b代替。

    result = "b"

3. cbacdcbc

        ^               //由于a比b小且a之后还有b,所以把b删去用a代替

    result = "a"

4. cbacdcbc

          ^               //第二步中删去的c第一次在这里出现,不过这个c未必是最终确定的位置,因为后面可能还有c

    result = "ac"

5. cbacdcbc

            ^               

    result = "acd"

6. cbacdcbc

              ^               

    result = "acd"

7. cbacdcbc

               ^          //这里b比d要小但不能再删d了,因为b之后没有d可以添加了,所以直接在acd后面加b

    result = "acdb"

8. cbacdcbc

                 ^               

    result = "acdb"

  通过以上的流程,我们得到结果acdb,代码如下。

Code:

 1 class Solution {
 2 public:
 3     string removeDuplicateLetters(string s) {
 4         string result = "";
 5         vector<int> count(128,0);
 6         vector<bool> visited(128,false);
 7         for(int i = 0;i != s.size();++i)
 8             count[s[i]]++;
 9         for(int i = 0;i != s.size();++i){
10             count[s[i]]--;
11             if(visited[s[i]]) continue;
12             while(s[i] < result.back() && count[result.back()] != 0){
13                 visited[result.back()] = false;
14                 result.pop_back();
15             }
16             result += s[i];
17             visited[s[i]] = true;
18         }
19         return result;
20     }
21 };

猜你喜欢

转载自www.cnblogs.com/haoweizh/p/10198571.html