找出最长的神奇数列
摘要
本题要求在由 0 和 1 组成的序列中,找到最长的交替出现的子序列,称为「神奇数列」,长度必须不少于 3。如果有多个,返回最先出现的。
问题描述
小F写下了一个由 0 和 1 组成的正整数序列,长度为 。我们要找出序列中最长的「神奇数列」,满足以下条件:
- 定义神奇数列:数列
0和1交替出现。 - 长度要求:必须至少包含 3 个以上的
0和1。
测试样例
- 输入:
inp = "0101011101"→ 输出:'010101' - 输入:
inp = "1110101010000"→ 输出:'10101010' - 输入:
inp = "1010101010101010"→ 输出:'1010101010101010'
解题思路
为了找到最长的神奇数列,我们可以采用遍历的方式:
- 动态扫描:从序列的第一个字符开始,维护一个当前的交替子串。如果发现当前字符和上一个字符不同,则继续扩展子串长度。
- 判断更新:一旦发现两个连续字符相同,则判断当前交替子串是否是最长的,并更新最长的记录。
- 结果输出:遍历结束后,检查最后一个子串是否是最长的。如果没有满足条件的子串,返回空字符串。
代码实现
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
复杂度分析
- 时间复杂度: ,因为我们只需遍历一次字符串。
- 空间复杂度: ,只使用了常量数量的辅助变量。