该题意思大概就是要形成正确的括号形式,左括号之间可以相互变换,右括号之间也可以相互变换,但左右括号之间不能相互变换。求出最小变换次数。 可以用STL中的stack解决,但没学过就用数组进行模拟压栈。
#include<stdio.h> #include<string.h> int main() { char a[1000005],b[1000000]; int n,j=0,sum=0,sum2=0; scanf("%s",a); n=strlen(a); for(int i=0;i<n;i++) { b[j]=a[i]; if(sum2<0) { printf("Impossible "); return 0; } switch(a[i])//利用ASCII码进行判断,如果匹配则弹出 { case '{':j++;sum2++;break; case '[':j++;sum2++;break; case '(':j++;sum2++;break; case '<':j++;sum2++;break; case '}':if(b[j-1]+2==a[i]){j--;}else{j--;sum++;}sum2--;break; case ']':if(b[j-1]+2==a[i]){j--;}else{j--;sum++;}sum2--;break; case ')':if(b[j-1]+1==a[i]){j--;}else{j--;sum++;}sum2--;break; case '>':if(b[j-1]+2==a[i]){j--;}else{j--;sum++;}sum2--;break; } } if(sum2!=0) { printf("Impossible "); return 0; } printf("%d ",sum); return 0; }