您的位置:首页 > 其它

网易校招第3题

2017-08-27 12:24 162 查看
如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串。例如: "1","10101","0101010"都是交错01串。
小易现在有一个01串s,小易想找出一个最长的连续子串,并且这个子串是一个交错01串。小易需要你帮帮忙求出最长的这样的子串的长度是多少。 

输入描述:

输入包括字符串s,s的长度length(1 ≤ length ≤ 50),字符串中只包含'0'和'1'



输出描述:

输出一个整数,表示最长的满足要求的子串长度。



输入例子1:

111101111



输出例子1:

3

思路:就是从0开始逐个比较,我是首先判断str[k]和str[k+1]的绝对值先得是1,然后进行比较:k,k+2,k+4,...以及k+1,k+3,k+5,...,进行比较,分别记录比较停止的位置,分别记为n1,n2,那么最长的长度就是:min(n1,n2)-k+1+1;这里第1个“1”,应该能理解,因为加上k本身,第二个“1”是这样的:比如一个在4停止的,一个在5停止的,那么其实4和5这两个位置都应该算在内的,所以还需要+1。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
string str;
cin>>str;
int f=1;
for(int i=0;i+1<str.length()&&f;i++)
{
if(str[i]!=str[i+1])
{
f=0;
}
}
if(str.length()==1)
{
cout<<1;
}
else if(f)
{
cout<<1;
}
else
{
int n1,n2,Max=0;
for(int k=0;k<str.length();k++)
{
if(abs(str[k]-str[k+1])==1)
{
int flag1=1,flag2=1;
for(int i=k;i<str.length()&&flag1;i+=2)
{
if(str[i]!=str[i+2])
{
flag1=0;
n1=i;
}
else
{
n1=i+2;
}
}
for(int i=k+1;i<str.length()&&flag2;i+=2)
{
if(str[i]!=str[i+2])
{
flag2=0;
n2=i;
}
else
{
n2=i+2;
}
}
Max=max(min(n1,n2)-k+2,Max);
}
}
cout<<Max;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: