Python实现最长相同字符子串提取:需输出多个最长子串求助
解决提取所有最长连续相同字符子串的问题
你的代码问题在于只跟踪了单个最长子串的位置,当遇到长度相同的其他最长子串时,不会记录下来,所以只能返回一个结果。要输出所有最长子串,得先把所有连续相同字符的子串都找出来,再筛选出长度最大的那些。
方案一:更清晰的遍历收集法
直接遍历字符串,先收集所有连续相同字符的子串,再筛选最长的:
def find_longest_substrings(s): if not s: return [] substrings = [] current_char = s[0] current_start = 0 for i in range(1, len(s)): if s[i] != current_char: # 记录当前连续子串 substrings.append(s[current_start:i]) current_char = s[i] current_start = i # 添加最后一个子串 substrings.append(s[current_start:]) # 计算最长子串长度 max_length = max(len(sub) for sub in substrings) # 筛选所有最长子串 longest_subs = [sub for sub in substrings if len(sub) == max_length] return longest_subs # 测试示例 print(find_longest_substrings('10111000')) # 输出 ['111', '000']
方案二:基于原代码修改
如果你想保留原代码的结构,只需调整为用列表维护所有最长子串:
def sequences(nums): if not nums: return [] pos1 = 0 pos2 = 1 # 初始化最长子串列表,先放入第一个字符 longest_subs = [nums[0]] current_max_len = 1 while pos2 < len(nums): if nums[pos2] != nums[pos2-1]: current_sub = nums[pos1:pos2] current_len = len(current_sub) if current_len > current_max_len: # 找到更长的子串,重置列表 longest_subs = [current_sub] current_max_len = current_len elif current_len == current_max_len: # 长度相同,加入列表 longest_subs.append(current_sub) pos1 = pos2 pos2 += 1 # 处理最后一段连续子串 current_sub = nums[pos1:pos2] current_len = len(current_sub) if current_len > current_max_len: longest_subs = [current_sub] elif current_len == current_max_len: longest_subs.append(current_sub) return longest_subs # 测试示例 print(sequences('10111000')) # 输出 ['111', '000']
核心逻辑说明
- 两种方案都先识别所有连续相同字符的子串
- 记录最长子串的长度,再筛选出所有长度等于该值的子串
- 返回结果改为列表类型,才能容纳多个最长子串
内容的提问来源于stack exchange,提问作者GGANGG
相关产品推荐
相关产品推荐

