扫过去。记录最大和最小可能开括号值
假设该尺寸比左小圆括号右括号尺寸。它不是不可避免
从扫再次。相同的记录最大和最小可能的左括号值
假定右括号尺寸小于开口括号的大小,它不是不可避免
最小值中的最大值,和最大值中的最小值
假设前者大于后者,则不行,假设后者大于前者则有多重解。假设相等则为唯一解(感谢LUKE队长提供的思路)
#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
') { if(a[i-1][0]==0)a[i][0]=1; else a[i][0]=a[i-1][0]-1; a[i][1]=a[i-1][1]+1; } if(a[i][0]>a[i][1])sig=1; } if(sig) { printf("None\n"); continue; } for(i=l; i>=1; i--) { if(s[i]==')')b[i-1][0]=b[i][0]+1,b[i-1][1]=b[i][1]+1; else if(s[i]=='(') { if(b[i][0]==0)b[i-1][0]=1; else b[i-1][0]=b[i][0]-1; b[i-1][1]=b[i][1]-1; } else if(s[i]=='?') { if(b[i][0]==0)b[i-1][0]=1; else b[i-1][0]=b[i][0]-1; b[i-1][1]=b[i][1]+1; } if(b[i][0]>b[i][1])sig=1; } if(sig) { printf("None\n"); continue; } for(i=1; i<=l; i++) { ta=max(a[i][0],b[i][0]); tb=min(a[i][1],b[i][1]); if(ta>tb) { sig|=1; break; } if(ta<tb) { sig|=2; } } if(sig&1) { printf("None\n"); continue; } else if(sig&2) { printf("Many\n"); continue; } else printf("Unique\n"); } return 0; }
版权声明:本文博客原创文章。博客,未经同意,不得转载。