题意:给你一串字符串,求一段它的子串,|它最大
题解:首先把串的前导0删去,删去无影响,便于后续操作,此时如果字符串全删完了,直接输出0,(别输出字符串),否则遍历剩下的字符串,找到第一个等于0的位置p = i记录下来,然后记录 m = n - i会影响的长度
如果没有为0的直接输出s
否则双重循环遍历i : 0 ~ l-1, j: 0 ~ r -1;
如果s[i+j] == '1' ,那么ans[l+j] = '1',因为前面连续1的段为r- 1
遍历i意思相当于把字符串往右拉了几位遍历(0~r-1)所有情况.
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
string s;
void solve(){
int n;
cin>>n;
cin>>s;
while(s[0]=='0'){
s.erase(0,1);
}
int len=s.size();
if(len==0){
cout<<"0\n";
return ;
}
else {
int l=-1,r=0;
for(int i=0;i<len;i++){
if(s[i]=='0'){
l=i;
break;
}
}
r=len-l;
if(l==-1){
cout<<s<<"\n";
return ;
}
else {
string maxl=s;
for(int i=0;i<l;i++){
string ss=s;
for(int j=0;j<r;j++){
if(s[i+j]=='1'){
ss[l+j]='1';
}
}
maxl=max(maxl,ss);
}
cout<<maxl<<"\n";
return ;
}
}
}
signed main(){
int t=1;
while(t--){
solve();
}
}