字符串中1s和0s的最大交替子序列

时间:2018-02-15 06:26:13

标签: java string binary

在仅包含1和0的String中查找最大的交替1和0子序列。还可以找到最大子序列的起始索引。

示例:

对于1101011,最长的交替子序列长度为5,从索引1到5。

我尝试通过比较连续元素来做到这一点,如果它们不相等,则将当前长度与最大尺寸进行比较:

int findSubArray(int arr[], int n) 
{
    int sum = 0;
    int maxsize = -1, startindex = 0;
    int endindex = 0;

    int j = 0;
    for (int i = 0; i < n - 1; i++)  {
        if (arr[i] != arr[i+1] && maxsize < i - j + 1) {
            maxsize = i - j + 1;
            startindex = j;
        } else {
            j = i;
        }
    }

    endindex = startindex+maxsize-1;
    if (maxsize == -1)
        System.out.println("No such subarray");
    else
        System.out.println(startindex+" to "+endindex);

    return maxsize;
}

测试方法:

int [] ia = {1, 1, 0, 1, 0, 1, 1};
findSubArray (ia, 7);

返回:5并打印0到4

问题是虽然它打印的正确长度为5,但索引不正确。正确的输出应为1到5。

要解决这个问题,如果我做j = i + 1,那么整个匹配就会进行折腾,我将索引设为0到0。

上述代码中的错误是什么?此外,替代方法的任何伪代码都会有所帮助。

1 个答案:

答案 0 :(得分:1)

j = i;更改为j = i + 1;是正确的,但这还不够。

您缺少的是当前的交替序列从j开始,到i+1结束,而不是i

此外,您的病情逻辑存在问题。只有当前交替序列结束时(即arr[i] == arr[i+1])才能到达你的else子句,但当当前序列不长于最大序列时也会达到。

因此,条件应分为两个条件:

if (arr[i] != arr[i+1]) {
    if (maxsize < i + 1 - j + 1) {
        maxsize = i + 1 - j + 1;
        startindex = j;       
    }
} else {
    j = i + 1;
}