B Nesting Depth (5pts, 11pt)
说实话,看到这个题,一下子就想起了之前coursera,pku的C语言基础里面的括号匹配问题,不过这个题是让你生成括号;
问题描述
给定T个字符串,其中包含1-9的数字,生成将这些数字包含的最短的完全匹配括号,比如1221,将每个数字完全包含的括号可以是(1)((2))((2))(1),但是正确的答案应该是(1(22)1);
首先把第一个数字s[0]前半部分括号生成,我们有 a[0]…a[s[0]-1]=’(’;a[s[0]]=s[0];
然后递归搜索s[1]…s[i+1];通过观察,最短的完全匹配括号有如下的性质:
1.当s[i]>s[i-1]时,我们需要在生成字符串的s[i-1]到s[i]的位置上补上’(’;即,
a[s[i-1]…a[s[i]-1]=’(’; a[s[i]]=s[i];
2.s[i]=s[i-1]时,此时不用补上括号,a[s[i-1]+1]=s[i];
3,s[i]<s[i-1]时,我们需要在生成字符串的s[i-1]到s[i]的位置上补上’)’;即,
a[s[i-1]…a[s[i]-1]=’)’; a[s[i]]=s[i];
代码如下:
#include<iostream>
#include<stdlib.h>
#include<string>
#include<stdio.h>
using namespace std;
char a[1000];
int b[1000];
char c[1000];
int n;
int pairs(int i,int j){
if(i>n){
return 0;}
else {
if(b[i]>b[i-1]){
int r=j+1;
for(int k=0;k<b[i]-b[i-1];k++){
a[r]='(';
r=r+1;}
j=j+b[i]-b[i-1]+1;
a[j]=c[i];
pairs(i+1,j);}
else if(b[i]==b[i-1]){
a[j+1]=c[i];
pairs(i+1,j+1);}
else{
int v=j+1;
for(int k=0;k<b[i-1]-b[i];k++){
a[v]=')';
v=v+1;}
j=j+b[i-1]-b[i]+1;
a[j]=c[i];
pairs(i+1,j);}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
{cin>>b[i];
c[i]=b[i]+'0';}
for(int i=0;i<b[0];i++){
a[i]='(';}
a[b[0]]=c[0];
pairs(1,b[0]);
for(int i=0;i<sizeof(a);i++){
cout<<a[i];}
}
当然这个代码是不能ac的,得更改一下输入输出格式;其他几个有空再更;