判断字符串重排后能否拼接为A个相同子串的代码问题排查
问题说明
需求定义
实现函数满足:重排字符串B的字符,使其可表示为A个相同字符串的拼接结果,其中B为字符串类型,A为整数类型,满足条件返回1,否则返回-1。
测试示例
- 示例1:B = "aabb"、A = 2,可重排为"abab",由2个"ab"拼接而成,返回1
- 示例2:输入A = 2、B = "bbaabb",输出1,可重排为"abbabb"
- 示例3:输入A = 1、B = "bc",输出1,原字符串已符合要求
- 示例4:输入A = 1、B = "aa",输出1,原字符串已符合要求
- 示例5:A = 2、B = "aaab",无法重排满足要求,输出-1
错误代码分析
用户提供的错误代码如下:
from itertools import combinations def solve(A, B): if B.count(B[0]) == len(B): return 1 comb = combinations(B, A) listOfElems = [''.join(i) for i in list(comb)] if len(listOfElems) == len(set(listOfElems)): return 1 return -1 A = 2 B = "abab" solve(A, B)
代码存在的问题:
- 核心逻辑完全偏离需求:使用
combinations获取所有长度为A的字符组合,和判断能否拆分出A个相同子串的需求无关 - 判断条件
len(listOfElems) == len(set(listOfElems))逻辑错误:该条件用于判断所有长度为A的组合都不重复,和题目要求没有关联 - 边界条件缺失:A=1时任意字符串都符合要求,代码没有处理该场景
- 没有覆盖核心判断规则:要满足拆分需求,每个字符的出现次数必须能被A整除,这是该题的核心判断依据,代码完全没有实现该逻辑
正确实现方案
核心思路:
要将字符串重排为A个相同子串的拼接,每个子串包含的字符种类和数量完全相同,因此字符串中每个字符的总出现次数必须能被A整除,只要满足这个条件就一定可以构造出符合要求的字符串。
正确代码:
from collections import Counter def solve(A, B): # A为1时任意字符串都符合要求 if A == 1: return 1 # 统计每个字符的出现次数 char_count = Counter(B) # 检查所有字符的出现次数都能被A整除 for cnt in char_count.values(): if cnt % A != 0: return -1 return 1
测试验证:
- 输入A=2,B="abab":字符a出现2次、b出现2次,都能被2整除,返回1,符合预期
- 输入A=2,B="aaab":字符a出现3次,3%2=1≠0,返回-1,符合预期
内容的提问来源于stack exchange,提问作者Maws
相关产品推荐
相关产品推荐

