题目
输入一串方波信号,求取最长的完全连续交替方波信号,并将其输出,如果有相同长度的交替方波信号,输出任一即可,方波信号高位用1标识,低位用0标识。
说明:
- 一个完整的信号一定以0开始然后以0 结尾,即 010 是一个完整信号,但101,1010,0101不是
- 输入的一串方波信号是由一个或多个完整信号组成
- 两个相邻信号之间可能有 0个或多个低位,如0110010,011000010(完整信号中间连续的0不算信号本身)
- 同一个信号中可以有连续的高位,如 01110101011110001010,前14位是一个具有连续高位的信号(连续的1可以看作信号的一部分)
- 完全连续交替方波是指10交替,如01010是完全连续交替方波,0110不是
输入
输入信号字符串(长度>=3 且<=1024):
0010101010110000101000010
注:输入总是合法的,不用考虑异常情况
输出
最长的完全连续交替方波信号串:
01010
若不存在完全连续交替方波信号串,输出-1
示例1:
输入:
00101010101100001010010
输出
01010
备注:
输入信号串中有三个信号:0010101010110(第一个信号段)00 01010(第二个信号段)010(第三个信号段)
第一个信号虽然有交替的方波信号段,但出现了11部分的连续高位,不算完全连续交替方波,在剩下的连续方波信号串中 01010最长
示例2:
输入:
00101010101000010100100
输出
01010101010
参考C++代码
#include <bits/stdc++.h>
using namespace std;
void GetLongestWave(string str, string &res)
{
int l = 0, r = 0;
int sta = -1, maxLen = -1;
while(r < str.size()) {
if (r > str.size() - 5) {// 不可能再组成一个完整交替信号了
break;
}
// 寻找信号段开始点
while(r < str.size() - 1 && (str[r] != '0' || (str[r] == '0' && str[r + 1] == '0') ) ) {
r++;
}
l = r;
// 寻找交替信号段结束点
while(r < str.size() - 1 && str[r] ^ str[r + 1]) {
r++;
}
// 判断是不是满足交替信号段,是且比之前的更长就更新
if (r - l >= 4 && str[r] == '0') {
if (r - l + 1 > maxLen) {
sta = l;
maxLen = r - l + 1;
}
}
}
res = sta == -1 ? "-1" : str.substr(sta, maxLen);
}
int main()
{
string str, res;
getline(cin, str);
GetLongestWave(str, res);
cout << res << endl;
return 0;
}