https://leetcode.com/problems/valid-parenthesis-string/description/
这个题的难点在增加了*,*可能是(也可能是)。是(的前提是:右边有多余的)。是)的前提是:左边有多余的(。所以他们的位置信息是重要的。
class Solution { public: bool checkValidString(string s) { // *可以是(或者), 用openMax/Min来表示最多和最少可能没有被匹配的(的数目. // openMin是由(引起的,openMax是由(和*引起的。)可以和openMax/Min匹配。 int openMax = 0, openMin = 0; for (auto c : s) { if (c == '(') { // 如果是(,openMax/Min都要加1 openMax++; openMin++; } else if (c == ')') { if (openMax < 1) return false; // 左边未匹配的(最多也没有1个,错误 openMax--; if (openMin > 0) // 如果openMin是0,说明匹配的是前面的*。 openMin--; } else { openMax++; // 可以作为(的数目+1. if (openMin > 0) // 如果之前有未匹配的(,这个*可以匹配那个(. openMin--; } } return openMin == 0; // 如果openMin是0,说明(都被匹配了 } };
Valid Parenthesis通常可以用stack来做。这个题目一个stack做不了,考虑用2个?
class Solution { public: bool checkValidString(string s) { stack<int> left, star; for (int i = 0; i < s.length(); i++) { if (s[i] == '(') left.push(i); else if (s[i] == ')') { if (!left.empty()) left.pop(); else if (!star.empty()) star.pop(); else return false; } else star.push(i); } while (!left.empty()) { if (star.empty() || star.top() < left.top()) return false; left.pop(); star.pop(); } return true; } };