3 <= A.length <= 30000
A[i] == 0或A[i] == 1
思路:
1.首先计算这个字符串中1的个数之和cnt
2.要把这个字符串分为3段,因为要求这三段所表示的二进制是相同的,因此就是要求这三段里面的数字1的位置必须是相同的,也就是说有3个相同的二进制数,因此这三段的二进制数就是有3个一样的数,
所以cnt%3==0,(首先保证1的个数在每段里面是相同的);
3.题目要求求i,j,所以我们要把分段的地方给求出来,所以有三个for循环依次用三个不同的变量依次记录第一出现1的下标ans1,cnt/3+1出现1的位置ans2,cnt/3*2+1的位置ans3;
4.然后再用a[ans1]==a[ans2]&&a[ans2]==a[ans3]&&ans<j判断,ans1++,ans2++,asn3++;就是相同就往后移一旦不相同或到了最后就截至
5.输出答案
代码:
#include<stdio.h> #include<string.h> int main(){ char a[60001]; char s[30001]; int cnt = 0; int j = 0; gets(a); for(int i=0;a[i]!=‘\0‘;i++){ if(a[i]==‘1‘) cnt++; if(a[i]==‘1‘||a[i]==‘0‘){ s[j++] = a[i]; } } printf("%s\n",s); s[j]=‘\0‘; int ans1=0; int ans2=0; int ans3 = 0; if(cnt%3!=0||cnt==0){ printf("-1 -1\n"); } else{ for(int i = 0;s[i]!=‘\0‘;i++){ if(s[i]==‘1‘){ ans1++; if(ans1==1){ ans1 = i; break; } } } for(int i = 0;s[i]!=‘\0‘;i++){ if(s[i]==‘1‘){ ans2++; if(ans2==cnt/3+1){ ans2 = i; break; } } } for(int i=0;s[i]!=‘\0‘;i++){ if(s[i]==‘1‘){ ans3++; if(ans3==cnt/3*2+1){ ans3=i; break;//比赛的时候忘记了 } } } while(s[ans1]==s[ans2]&&s[ans2]==s[ans3]&&ans3<j){ ans1++;ans2++;ans3++; } if(ans3==j) printf("%d %d\n",ans1-1,ans2); else printf("-1 -1\n"); } return 0; }