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

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对应{,不属于小写字母范围)
    • 仅判断前半位的字符类型,未单独处理后半位为确定字母、前半位为?的场景
  • 占位符处理逻辑错误:
    • 当对应位置前半位是确定字母、后半位是?时,原始代码会误判为不匹配直接返回-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 18:36:03