diff --git a/README.md b/README.md index 87c4a34..1c80f99 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ LeetCode | # | Title | Solution | Difficulty | |---| ----- | -------- | ---------- | |1573|[Number of Ways to Split a String](https://leetcode.com/problems/number-of-ways-to-split-a-string/) | [C++](./algorithms/cpp/NumberOfWaysToSplitString/NumberOfWaysToSplitString.cpp)|Medium| +|1541|[Minimum Insertions to Balance a Parentheses String](https://leetcode.com/problems/minimum-insertions-to-balance-a-parentheses-string/) | [C++](./algorithms/cpp/minimumInsertionsToBalanceAParenthesesString/MinimumInsertionsToBalanceAParenthesesString.cpp)|Medium| |1535|[Find the Winner of an Array Game](https://leetcode.com/problems/find-the-winner-of-an-array-game/) | [C++](./algorithms/cpp/findTheWinnerOfAnArrayGame/FindTheWinnerOfAnArrayGame.cpp)|Medium| |1470|[Shuffle the Array](https://leetcode.com/problems/shuffle-the-array/) | [C++](./algorithms/cpp/shuffleTheArray/ShuffleTheArray.cpp)|Easy| |1464|[Maximum Product of Two Elements in an Array](https://leetcode.com/problems/maximum-product-of-two-elements-in-an-array/) | [C++](./algorithms/cpp/maximumProductOfTwoElementsInAnArray/MaximumProductOfTwoElementsInAnArray.cpp)|Easy| diff --git a/algorithms/cpp/minimumInsertionsToBalanceAParenthesesString/MinimumInsertionsToBalanceAParenthesesString.cpp b/algorithms/cpp/minimumInsertionsToBalanceAParenthesesString/MinimumInsertionsToBalanceAParenthesesString.cpp new file mode 100644 index 0000000..7f8ce22 --- /dev/null +++ b/algorithms/cpp/minimumInsertionsToBalanceAParenthesesString/MinimumInsertionsToBalanceAParenthesesString.cpp @@ -0,0 +1,92 @@ +// Source : https://leetcode.com/problems/minimum-insertions-to-balance-a-parentheses-string/ +// Author : Hao Chen +// Date : 2020-10-02 + +/***************************************************************************************************** + * + * Given a parentheses string s containing only the characters '(' and ')'. A parentheses string is + * balanced if: + * + * Any left parenthesis '(' must have a corresponding two consecutive right parenthesis '))'. + * Left parenthesis '(' must go before the corresponding two consecutive right parenthesis + * '))'. + * + * In other words, we treat '(' as openning parenthesis and '))' as closing parenthesis. + * + * For example, "())", "())(())))" and "(())())))" are balanced, ")()", "()))" and "(()))" are not + * balanced. + * + * You can insert the characters '(' and ')' at any position of the string to balance it if needed. + * + * Return the minimum number of insertions needed to make s balanced. + * + * Example 1: + * + * Input: s = "(()))" + * Output: 1 + * Explanation: The second '(' has two matching '))', but the first '(' has only ')' matching. We need + * to to add one more ')' at the end of the string to be "(())))" which is balanced. + * + * Example 2: + * + * Input: s = "())" + * Output: 0 + * Explanation: The string is already balanced. + * + * Example 3: + * + * Input: s = "))())(" + * Output: 3 + * Explanation: Add '(' to match the first '))', Add '))' to match the last '('. + * + * Example 4: + * + * Input: s = "((((((" + * Output: 12 + * Explanation: Add 12 ')' to balance the string. + * + * Example 5: + * + * Input: s = ")))))))" + * Output: 5 + * Explanation: Add 4 '(' at the beginning of the string and one ')' at the end. The string becomes + * "(((())))))))". + * + * Constraints: + * + * 1 <= s.length <= 10^5 + * s consists of '(' and ')' only. + ******************************************************************************************************/ +class Solution { +public: + int minInsertions(string s) { + vector stack; + + int cnt = 0; + int len = s.size(); + for (int i=0; i 0) { + stack.pop_back(); + } else { + cnt++; // missed the '(' + } + + // if s[i+1] is ')', need to skip + if ( i < len -1 && s[i+1] == ')' ) { + i++; + }else{ + cnt++; //missed the ')' + } + + } + + // if the stack still has '(', which means need double of ')' + return cnt + stack.size()*2; + } +};