1. 思路解析
- 初始化变量:设置
max_length用于记录最长神奇数列的长度,初始化为 0;start_index用于记录最长神奇数列的起始位置,初始化为 0;current_length用于记录当前正在统计的数列长度,初始化为 0;current_start用于记录当前数列的起始位置,初始化为 0。 - 遍历输入字符串:逐个字符检查输入字符串
inp中的字符。 - 计数与更新:如果当前字符为
0,且当前数列长度current_length为奇数(意味着前面是连续的1),则current_length加 1;否则,将当前位置i作为新的起始位置current_start,并将current_length重置为 1。如果当前字符为1,且当前数列长度current_length为偶数(意味着前面是连续的0),则current_length加 1;否则,同样将当前位置i作为新的起始位置current_start,并将current_length重置为 1。 - 检查与更新最长神奇数列:在每次更新
current_length后,检查current_length是否大于等于max_length且大于等于 3。如果是,则更新max_length为current_length,并更新start_index为current_start。 - 返回结果:遍历完整个字符串后,返回从
start_index开始,长度为max_length的子串,即为最长的神奇数列。
2. 图解(以inp = "0101011101"为例)
| 步骤 | 字符 | 当前数列长度(current_length) | 当前数列起始位置(current_start) | 最长神奇数列长度(max_length) | 最长神奇数列起始位置(start_index) |
|---|---|---|---|---|---|
| 1 | 0 | 1 | 0 | 0 | 0 |
| 2 | 1 | 2 | 0 | 0 | 0 |
| 3 | 0 | 3 | 2 | 3 | 2 |
| 4 | 1 | 4 | 2 | 4 | 2 |
| 5 | 0 | 5 | 4 | 5 | 4 |
| 6 | 1 | 6 | 4 | 6 | 4 |
| 7 | 1 | 1(重置,因为不满足交替) | 7 | 6 | 4 |
| 8 | 1 | 2(继续新的计数) | 7 | 6 | 4 |
| 9 | 0 | 3(新的交替数列开始) | 8 | 6 | 4 |
| 10 | 1 | 4(继续交替) | 8 | 6 | 4 |
3. 代码详解
以下是对代码中关键部分的详细解释:
def solution(inp):
max_length = 0 # 记录最长神奇数列的长度
start_index = 0 # 记录最长神奇数列的起始位置
current_length = 0 # 记录当前正在统计的数列长度
current_start = 0 # 记录当前数列的起始位置
for i in range(len(inp)): # 遍历输入字符串
if inp[i] == '0':
if current_length % 2 == 1: # 如果当前数列长度为奇数(前面是连续的1)
current_length += 1
else: # 否则,开始新的数列
current_start = i
current_length = 1
else: # 同理,处理当前字符为1的情况
if current_length % 2 == 0:
current_length += 1
else:
current_start = i
current_length = 1
if current_length >= max_length and current_length >= 3: # 检查是否更新最长神奇数列
max_length = current_length
start_index = current_start
return inp[start_index:start_index + max_length] # 返回最长的神奇数列
在上述代码中,我遍历输入字符串。当遇到与当前计数奇偶性不同的字符时,更新当前计数和起始位置。如果当前计数大于等于最大长度且大于等于 3,更新最大长度和起始索引。最后返回最长的神奇数列子串。