You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

统计特定字符三元组数量的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:35:56