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

如何检测字符串中的非重叠AB与BA子串?现有代码需修正

嘿,我明白你的问题了——你想检测字符串里有没有不重叠的AB和BA子串(顺序没关系),但你现在的代码完全没抓住核心需求,咱们一步步来搞定它!

先说说你当前代码的问题

你的代码逻辑完全偏离了需求:

  • set('AB' and 'BA')这行是错误的:Python里'AB' and 'BA'会返回'BA'(非空字符串都是真值,and运算符会返回最后一个真值),所以你实际上只是在检查字符串里只有B和A。
  • 你的逻辑仅验证了字符串是否由A、B组成,完全没检测AB和BA子串的存在,更别说它们是否重叠了——这就是为什么ABA会被错误输出YES,但它的AB和BA是重叠的,应该返回NO。

正确的思路与代码

我们的核心需求是:字符串中同时存在AB和BA,并且这两个子串不重叠(也就是其中一个的结束位置早于另一个的起始位置)。

下面是能满足需求的代码,逻辑清晰且覆盖所有测试场景:

s = input().strip()

# 第一步:先确认字符串同时包含AB和BA子串
has_ab = 'AB' in s
has_ba = 'BA' in s

if not (has_ab and has_ba):
    print('NO')
else:
    # 收集所有AB子串的起始索引
    ab_indices = [i for i in range(len(s)-1) if s[i:i+2] == 'AB']
    # 收集所有BA子串的起始索引
    ba_indices = [i for i in range(len(s)-1) if s[i:i+2] == 'BA']
    
    # 检查是否存在一对不重叠的AB和BA
    found = False
    for ab_idx in ab_indices:
        for ba_idx in ba_indices:
            # 两种不重叠情况:AB在BA前面且完全不重叠,或者BA在AB前面且完全不重叠
            if (ab_idx + 2 <= ba_idx) or (ba_idx + 2 <= ab_idx):
                found = True
                break
        if found:
            break
    print('YES' if found else 'NO')

测试你的示例用例

  • 输入ABBA:AB在索引0,BA在索引2,0+2=2 <=2,满足不重叠条件,输出YES
  • 输入BAAB:BA在索引0,AB在索引2,0+2=2 <=2,输出YES
  • 输入ABA:AB在0,BA在1,所有组合都重叠,输出NO
  • 输入ABHA:不存在BA子串,输出NO

更高效的简化写法(适合长字符串)

如果字符串很长,我们可以不用遍历所有索引,只检查关键位置就能判断:

s = input().strip()

has_ab = 'AB' in s
has_ba = 'BA' in s

if not (has_ab and has_ba):
    print('NO')
else:
    # 检查第一个AB后面是否有不重叠的BA
    ab_pos = s.index('AB')
    if 'BA' in s[ab_pos+2:]:
        print('YES')
    # 检查第一个BA后面是否有不重叠的AB
    elif 'AB' in s[s.index('BA')+2:]:
        print('YES')
    # 检查最后一个AB前面是否有不重叠的BA
    elif 'BA' in s[:s.rindex('AB')]:
        print('YES')
    # 检查最后一个BA前面是否有不重叠的AB
    elif 'AB' in s[:s.rindex('BA')]:
        print('YES')
    else:
        print('NO')

内容的提问来源于stack exchange,提问作者Ali Zareei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:45:42