统计特定字符三元组数量的Python代码异常:预期输出1实际为0
问题描述
给定长度为N、仅含R、G、B字符的字符串s,需统计满足以下条件的三元组(i,j,k)(1≤i<j<k≤N)的数量:
- 三个位置的字符互不相同(Sᵢ≠Sⱼ≠Sₖ)
- j不是i和k的中点(j-i≠k-j,即三个位置不构成等差数列)
输入格式为:第一行输入N,第二行输入字符串s。现有一段Python代码无法正确解决该问题,示例输入4和RRGB时,预期输出为1,但代码实际返回0。错误代码如下:
N = int(input()) s = input() res = s[1:] cnt = 0 for i in range(len(res)): if res[i-1] == 'R': for k in range(len(res)-1): if res[k] == "G": for t in range(len(res)-2): if res[t+1] == "B": cnt += 1 print(cnt)
错误定位
这段代码存在多处核心错误:
- 错误切片原字符串:
res = s[1:]直接丢弃了原字符串的第一个字符,导致后续遍历完全无法覆盖所有合法的三元组位置。 - 循环逻辑完全混乱:三重循环的变量i、k、t没有对应三元组(i,j,k)的顺序关系,只是无关联地遍历,根本无法保证
i<j<k的要求。 - 字符判断逻辑僵化:硬编码只统计R→G→B的固定顺序组合,忽略了其他合法的字符排列(比如R→B→G、G→R→B等)。
- 完全未处理
j-i≠k-j的条件:没有对位置是否构成等差数列做判断。
修正方案
正确的思路是遍历所有满足i<j<k的三元组,依次判断字符是否互不相同、位置是否不构成等差数列,统计符合条件的数量。修正后的代码如下:
N = int(input()) s = input() cnt = 0 # 用0-based索引遍历所有i<j<k的组合 for i in range(N): for j in range(i + 1, N): for k in range(j + 1, N): # 检查三个字符是否互不相同 if s[i] != s[j] and s[j] != s[k] and s[i] != s[k]: # 检查位置是否不构成等差数列 if j - i != k - j: cnt += 1 print(cnt)
示例验证
对于输入4和RRGB,所有合法的三元组组合及判断结果:
- (0,1,2):字符R、R、G,存在重复,不计数
- (0,1,3):字符R、R、B,存在重复,不计数
- (0,2,3):字符R、G、B,互不相同;位置差2和1不相等,计数+1
- (1,2,3):字符R、G、B,互不相同;位置差均为1,构成等差数列,不计数
最终输出为1,符合预期。
内容的提问来源于stack exchange,提问作者Codeer
相关产品推荐
相关产品推荐

