找出最长的神奇数列 | 豆包MarsCode AI刷题

98 阅读3分钟

找出最长的神奇数列

找出最长的神奇数列 - MarsCode

摘要

本题要求在由 01 组成的序列中,找到最长的交替出现的子序列,称为「神奇数列」,长度必须不少于 3。如果有多个,返回最先出现的。

问题描述

小F写下了一个由 01 组成的正整数序列,长度为 nn。我们要找出序列中最长的「神奇数列」,满足以下条件:

  1. 定义神奇数列:数列 01 交替出现。
  2. 长度要求:必须至少包含 3 个以上的 01

测试样例

  1. 输入: inp = "0101011101"输出: '010101'
  2. 输入: inp = "1110101010000"输出: '10101010'
  3. 输入: inp = "1010101010101010"输出: '1010101010101010'

解题思路

为了找到最长的神奇数列,我们可以采用遍历的方式:

  1. 动态扫描:从序列的第一个字符开始,维护一个当前的交替子串。如果发现当前字符和上一个字符不同,则继续扩展子串长度。
  2. 判断更新:一旦发现两个连续字符相同,则判断当前交替子串是否是最长的,并更新最长的记录。
  3. 结果输出:遍历结束后,检查最后一个子串是否是最长的。如果没有满足条件的子串,返回空字符串。

代码实现

Go 语言实现

package main

import (
	"fmt"
)

// 解决最长神奇数列的问题
func solution(inp string) string {
	n := len(inp)
	if n < 3 {
		return ""
	}

	// 记录当前子串的起始位置和长度
	start, maxLength, currentStart, currentLength := 0, 0, 0, 1

	// 遍历输入字符串
	for i := 1; i < n; i++ {
		// 检查是否是交替的0和1
		if inp[i] != inp[i-1] {
			currentLength++
		} else {
			// 如果长度大于等于3且大于当前的最大长度,则更新最大长度
			if currentLength >= 3 && currentLength > maxLength {
				maxLength = currentLength
				start = currentStart
			}
			// 重置当前子串的起始位置和长度
			currentStart = i
			currentLength = 1
		}
	}

	// 最后再检查一次,如果最后一个交替子串是最长的
	if currentLength >= 3 && currentLength > maxLength {
		maxLength = currentLength
		start = currentStart
	}

	// 如果没有找到符合条件的神奇数列
	if maxLength < 3 {
		return ""
	}

	// 返回最长的神奇数列
	return inp[start : start+maxLength]
}

func main() {
	// 测试用例
	fmt.Println(solution("0101011101"))        // 输出:010101
	fmt.Println(solution("1110101010000"))     // 输出:10101010
	fmt.Println(solution("1010101010101010"))  // 输出:1010101010101010
	fmt.Println(solution("110"))               // 输出:""
	fmt.Println(solution("101"))               // 输出:"101"
}

Python 版本实现

def solution(inp: str) -> str:
    """
    查找给定字符串中最长的交替子串。
    
    :param inp: 输入的二进制字符串
    :return: 最长的交替子串
    """
    n = len(inp)
    if n < 3:
        return ""
    
    # 初始化变量
    start = 0
    max_length = 0
    current_start = 0
    current_length = 1

    # 遍历字符串
    for i in range(1, n):
        if inp[i] != inp[i - 1]:
            current_length += 1
        else:
            if current_length >= 3 and current_length > max_length:
                max_length = current_length
                start = current_start
            current_start = i
            current_length = 1

    # 最后再检查一次
    if current_length >= 3 and current_length > max_length:
        max_length = current_length
        start = current_start

    if max_length < 3:
        return ""
    
    return inp[start:start + max_length]

if __name__ == "__main__":
    # 测试用例
    print(solution("0101011101") == "010101")  # True
    print(solution("1110101010000") == "10101010")  # True
    print(solution("1010101010101010") == "1010101010101010")  # True
    print(solution("110") == "")  # True
    print(solution("101") == "101")  # True

复杂度分析

  • 时间复杂度: O(n)O(n),因为我们只需遍历一次字符串。
  • 空间复杂度: O(1)O(1),只使用了常量数量的辅助变量。