Python实现含?占位符的字典序匹配字符串构造,求代码指导
问题背景与实现规则
- 待处理字符串长度为
2k,需满足前k位与后k位对应位置字符完全一致 - 若对应位置两个均为确定小写字母且不相同,直接返回
-1 - 其余场景将
?占位符替换为对应匹配字符,生成合法字符串 - 示例1:输入
"ab"、k=1,对应位置a与b不匹配,输出-1 - 示例2:输入
"ta?a"、k=2,替换后得到"tata"为合法输出
原始代码问题排查
- 输入类型错误:
k=input()获取的是字符串类型,无法直接作为循环边界使用,需转为整数 - 字符串不可变问题:Python中字符串是不可变类型,无法直接用
s[i] = xxx修改字符,会触发语法错误 - 字符判断逻辑错误:
- 直接将字符与ASCII码(97、123)比较,需用
ord()转换为ASCII值,且小写字母上限应为122(对应z)而非123(123对应{,不属于小写字母范围) - 仅判断前半位的字符类型,未单独处理后半位为确定字母、前半位为
?的场景
- 直接将字符与ASCII码(97、123)比较,需用
- 占位符处理逻辑错误:
- 当对应位置前半位是确定字母、后半位是
?时,原始代码会误判为不匹配直接返回-1,不符合示例预期 - 未处理前后半位均为
?的场景 - 直接用字符比较大小(
s[i]>=s[i+k])无实际意义,需求仅要求对应位置一致,无大小比较要求
- 当对应位置前半位是确定字母、后半位是
- 返回逻辑错误:顶层代码不能直接使用
return语句,该语句仅可在函数内部使用
修正后实现逻辑
- 将输入字符串转为可变的字符列表,方便修改占位符
- 遍历
0到k-1的每一组对应位置(前半位i与后半位i+k) - 分场景处理每组位置:
- 若前后均为确定字母:两者不同则直接返回
-1,相同则跳过 - 若前为确定字母、后为
?:将后半位替换为前半位字符 - 若后为确定字母、前为
?:将前半位替换为后半位字符 - 若前后均为
?:统一替换为a(若需最小字典序输出,该处理为最优解)
- 若前后均为确定字母:两者不同则直接返回
- 遍历完成后将字符列表拼接为字符串输出
修正后代码示例
# 读取输入并转为可变列表 s = list(input().strip()) k = int(input().strip()) for i in range(k): front = s[i] back = s[i + k] # 前后都是确定字母 if front != '?' and back != '?': if front != back: print(-1) exit() # 前确定后为占位符 elif front != '?' and back == '?': s[i + k] = front # 后确定前为占位符 elif front == '?' and back != '?': s[i] = back # 前后都是占位符,替换为a保证字典序最小 else: s[i] = s[i + k] = 'a' # 拼接输出结果 print(''.join(s))
内容的提问来源于stack exchange,提问作者Aryan Tyagi
相关产品推荐
相关产品推荐

