最长连续交替方波信号

题目

输入一串方波信号,求取最长的完全连续交替方波信号,并将其输出,如果有相同长度的交替方波信号,输出任一即可,方波信号高位用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 

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;
}

你可能感兴趣的:(华为OD机考,leetcode刷题,华为机考,算法)