如何检测字符串中的非重叠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
相关产品推荐
相关产品推荐

