一个完整的括号字符串定义规则如下:
1、空字符串是完整的。
2、如果s是完整的字符串,那么(s)也是完整的。
3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。
例如,"(()())", ""和"(())()"是完整的括号字符串,"())(", "()(" 和 ")"是不完整的括号字符串。
牛牛有一个括号字符串s,现在需要在其中任意位置尽量少地添加括号,将其转化为一个完整的括号字符串。请问牛牛至少需要添加多少个括号。
输入包括一行,一个括号序列s,序列长度length(1 ≤ length ≤ 50). s中每个字符都是左括号或者右括号,即'('或者')'.
输出一个整数,表示最少需要添加的括号数
(()(()
2
/* 思路:类似栈的思想 左右括号相遇时可消除 countL 记录最终正确括号消除后所剩的'('的数目 countL 记录最终正确括号消除后所剩的')'的数目 */ import java.util.*; public class Main{ public static void main(String[] args){ try(Scanner in = new Scanner(System.in)){ System.out.println(helper(in.nextLine())); } } public static int helper(String s){ char[] cs = s.toCharArray(); int countL = 0,countR = 0,i = 0; while(i < cs.length){ if(cs[i] == '('){ countL++; }else { // 遇到右括号时,若前面有左括号未匹配,则匹配消除 如果没有,则右括号数目加1 if(countL != 0){ countL--; }else{ countR++; } } i++; } return countL + countR; } }
本套3道题的C++代码已挂到了我的GitHub(https://github.com/shiqitao/NowCoder-Solutions)
牛客网上的其他题目解答也在持续更新。
#include
#include
using namespace std;
int main()
{
string str; cin >> str;
int result = 0, num = 0;
for (int i = 0; i < str.length(); i++) {
if (str[i] == '(') num++;
else {
if (num == 0) result++;
else num--;
}
}
cout << result + num << endl;
return 0;
}
遍历字符串,当遇到左括号时,count++
遇到右括号时,count--
每当count=-1时,need++,表示缺失的左括号数
最后count + need就是所得结果
import java.util.*; public class Main { public static void main(String[] args) { int need = 0; int count = 0; Scanner sc = new Scanner(System.in); String str = sc.next(); for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == '(') { count++; } else { count--; } if (count < 0) { count = 0; need++; } } System.out.println(need + count); } }
#include <iostream> #include <stack> using namespace std; int main(){ string str; cin >> str; int right = 0; stack<char> stac; for(int i = 0; i < str.size(); ++i){ if(str[i] == ')' && (stac.empty() || stac.top() == ')')){ ++right; }else if(str[i] == '('){ stac.push(str[i]); }else if(str[i] == ')' && stac.top() == '('){ stac.pop(); } } cout << stac.size() + right << endl;; return 0; }
#include<stdlib.h> #include<iostream> #include<string> #include<stack> #include<algorithm> using namespace std; int main() { string s; cin>>s; stack<char>st; int res=0; for(int i=0;i<s.size();i++) { if(s[i]=='(') st.push(s[i]); else { if(st.empty()) res++; else st.pop(); } } if(!st.empty()) res+=st.size(); cout<<res<<endl; return 0; }
lenth=len(aa)
k=0
count=0
for i in range(lenth):
if(aa[i]== '(' ):
k=k+1
elif((aa[i]== ')')&(k>0)):
k=k-1
else:
count=count+1
k=k+count
print(k)
Count多余的右括号,K记录多余的左括号;def bracket(b): while "()" in b: b = b.replace("()","") return len(b) def brack(b): res = [b[0]] for i in range(1, len(b)): # 如果不添加res条件,会报请检查是否存在语法错误或者数组越界非法访问等情况 if res and b[i] == ")" and res[-1] == "(": res.pop() else: res.append(b[i]) return len(res) if __name__ == "__main__": b = input() print(brack(b))
#include <bits/stdc++.h> using namespace std; int main() { string s; while(cin>>s){ int n = s.length(); stack<char> S; for(int i=0;i<n;i++){ if(s[i]=='(') S.push(s[i]); else if(s[i]==')'){ if(!S.empty() && S.top()=='(') S.pop(); else S.push(s[i]); } } cout<<S.size()<<endl; } return 0; }
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; char s[100]; int dp[100][100],i,j,n,k; int main(){ scanf("%s",s),n=strlen(s); for(i=n-1;i>=0;i--) for(j=i;j<n;j++) if(i==j) dp[i][j]=1; else if(i+1==j){ if(s[i]=='('&&s[j]==')') dp[i][j]=0; else dp[i][j]=2; }else{ dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1; if(s[i]=='('&&s[j]==')') dp[i][j]=min(dp[i][j],dp[i+1][j-1]); for(k=i;k<j;k++) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); } printf("%d\n",dp[0][n-1]); }
private static int solve(String string) { int count = 0; LinkedList<Character> stack = new LinkedList<>(); for (char c : string.toCharArray()) { switch (c) { case '(': stack.push(c); break; case ')': if (stack.isEmpty()) { count++; } else { stack.pop(); } break; default: break; } } count += stack.size(); return count; }
#include<stdio.h> #include<string.h> int main() { char a[1000]; while (gets(a)) { int i,j=-1; char t[1000]; for(i=0;i<strlen(a);i++) { if(a[i]=='(') { t[++j]=a[i]; } else if(a[i]==')') { if(t[j]=='(') { j--; } else { t[++j]=a[i]; } } } printf("%d\n",j+1); } return 0; }
#include <bits/stdc++.h> using namespace std; int main() { string s; cin >> s; int sum = 0; stack<char> sc; for (int i = 0; i < s.size(); i++) { if (s[i] == '(')sc.push(s[i]); else if (s[i] == ')' && !sc.empty())sc.pop(); else if (s[i] == ')'&&sc.empty()) sum++; } cout << sum + sc.size(); }
#include <stdio.h> #include <string.h> char s[60]; int main() { int i=0,j,k,flag; for(gets(s);s[i];i++) { if(s[i]=='(') { flag = 0; for(j=i+1;s[j];j++) if(s[j]==')') { flag = 1; break; } if(flag) { for(k=j;s[k];k++) s[k] = s[k+1]; for(k=i;s[k];k++) s[k] = s[k+1]; i--; } } } printf("%d\n",strlen(s)); return 0; }
import java.util.Scanner; import java.util.Stack; /** * @author Shumao * @date 2019/6/24 16:37 */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String line = scanner.nextLine(); Stack<Character> stack = new Stack<>(); for (int i = 0; i < line.length(); i++) { char ch = line.charAt(i); if (!stack.empty() && '(' == stack.peek() && ')' == ch) { stack.pop(); } else { stack.push(ch); } } System.out.println(stack.size()); } scanner.close(); } }
""" 思路有2个: 1.有效的括号表达式应该是左括号数量和有括号数量相等,二者之差就表示需要添加的括号数量 2.按照判断是否是有效括号的思路,左括号进栈,遇到右括号出栈,最后栈中剩余的元素个数(全是左括号) 即是需要添加 的括号数量 """ string = input() def get_mini_nums1(): # 通过60%有问题 left_brace = string.count('(') right_brace = string.count(')') return abs(left_brace-right_brace) def get_mini_nums2(): stack = [] count = 0 for char in string: if char=='(': stack.append(char) else: if stack: stack.pop() else: # 如果第一个是右括号,栈为空 # 则需要补充一个左括号 count += 1 count += len(stack) return count if __name__ == '__main__': print(get_mini_nums2())