1573. 分割字符串的方案数
思路:先遍历一遍字符串,统计有多少个‘1’,如果为sum=0,那么就是C(n-1,2);如果sum%3!=0,那么为0;接下来就是统计两个分界线可以放在哪些位置,对于第一条分界线,其左边的1数量一定要为sum/3;对于第二条分界线,其右边的1数量一定也为sum/3,这样我们看看两条分界线在两边分别有多少种落脚点left、right,然后得到其组合数left*right即可。
class Solution {
public:
int numWays(string s) {
int mod=1e9+7;
int n=s.size();
int sum=0;
for(int i=0;i<n;i++){
if(s[i]=='1') sum++;
}
if(sum==0){
long t=(long)(n-1)*(n-2)/2;
return (int)(t%mod);
}else if(sum%3!=0) return 0;
sum/=3;
int id1=-1,id2=-1;
int ct=sum;
int left=0;
for(int i=0;i<n;i++){
if(s[i]=='1'){
if(ct){
ct--;
}else{
left++;
break;
}
}else if(!ct){
left++;
}
}
ct=sum;
int right=0;
for(int i=n-1;i>=0;i--){
if(s[i]=='1'){
if(ct){
ct--;
}else{
right++;
break;
}
}else if(!ct){
right++;
}
}
long t=(long)(left)*right;
return (int)(t%mod);
}
};