Tony's Log

Algorithms, Distributed System, Machine Learning

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

DFS with pruning. The thought flow: for each char, we have 2 choices: pick or not - then DFS.

class Solution {
  int len;
  unordered_set<string> rec;  
  vector<string> ret;
  void go(const string &s, int i, string picked, int cl, int cr)
  {
    // prune
    if(cl < cr) return;
    if((cl - cr) > s.length()) return;
    if((picked.length() + s.length() - i) < len) return;
      
    if(i == s.length())
    {
      if(cl == cr)
      {
        auto clen = picked.length();
        if(clen >= len)
        {
          if(clen > len)
          {
            len = clen;
            rec.clear();
            ret.clear();
          }
          
          if(!rec.count(picked))
          {
            rec.insert(picked);
            ret.push_back(picked);
          }      
        }
      }
      return;
    }
        
    go(s, i + 1, picked, cl, cr); // drop
    
    char c = s[i];
    int ncl = cl, ncr = cr;
    if(c == '(')        ncl ++;
    else if (c == ')')  ncr ++;
    go(s, i + 1, picked + c, ncl, ncr); // pick
  }
public:
    vector<string> removeInvalidParentheses(string s) {
        len = 0;
    go(s, 0, "", 0, 0);
        return ret;
    }
};
posted on 2015-11-05 06:36  Tonix  阅读(322)  评论(0编辑  收藏  举报