编写find_longest_string函数:统计矩阵对角线字母并找最长串
优化矩阵右上三角对角线最长重复字母字符串查找函数
需求回顾
实现Python函数find_longest_string(legoString, n):
- 将输入的
legoString转换为n列的矩阵 - 从矩阵的右上三角区域的所有左上到右下对角线上,找出某一字母出现次数最多的字符串(即该字母重复对应次数的结果)
- 若存在多个长度相同的最优解,返回任意一个即可
原代码存在的问题
- 核心逻辑错误:没有遍历对角线,反而在同一行内比较相邻字符,完全偏离了“对角线统计”的需求
- 硬编码字母:仅处理R、B、G、Y、C五种字母,新增字母时会直接失效
- 长度判断逻辑混乱:比如
len(countr) >= len(countb) and len(countg) and len(county) and len(countc)中,len(countg)是判断长度是否非零,不是比较长度大小,导致返回结果完全不符合预期 - 未区分右上三角区域:没有筛选出右上三角的对角线,遍历范围错误
优化后的代码
from collections import defaultdict def find_longest_string(legoString, n): # 将字符串转为n列的二维矩阵 row_count = len(legoString) // n matrix = [list(legoString[i*n : (i+1)*n]) for i in range(row_count)] max_occurrence = 0 target_char = '' # 遍历右上三角的所有左上到右下对角线(j - i = k,k >= 0) for k in range(n): diagonal_chars = [] i, j = 0, k # 收集这条对角线上的所有字符 while i < row_count and j < n: diagonal_chars.append(matrix[i][j]) i += 1 j += 1 # 统计当前对角线的字母出现次数 count_map = defaultdict(int) for char in diagonal_chars: count_map[char] += 1 # 更新全局最大出现次数和对应字母 if count_map: current_max = max(count_map.values()) current_char = max(count_map, key=count_map.get) if current_max > max_occurrence: max_occurrence = current_max target_char = current_char # 返回结果:目标字母重复max_occurrence次 return target_char * max_occurrence
代码逻辑说明
- 矩阵转换:按n列分割输入字符串,得到二维矩阵,方便后续对角线遍历
- 对角线遍历:右上三角的对角线可通过
j - i = k(k为非负整数)确定,从第一行的不同列出发,向下向右收集对角线上的所有字符 - 字母统计:用
defaultdict统计每条对角线的字母出现次数,避免硬编码限制 - 结果筛选:记录所有对角线中出现次数最多的字母和次数,最后返回该字母重复对应次数的字符串
内容的提问来源于stack exchange,提问作者user20567408
相关产品推荐
相关产品推荐

