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

如何正确解决这道LeetCode字典序合并字符串问题?

问题分析与解决

你的代码逻辑是严格按照题目描述“每次选取两个字符串首字符中字典序更小的字符合并”实现的,这也是部分用例(如s1='super',s2='tower')能得到正确结果的原因。但你提到的错误用例中,所谓“正确输出”和该逻辑矛盾,这里需要明确几个核心点:

1. 字典序的判断是正确的

Python中字符串的比较基于Unicode码点,小写字母的字典序和ASCII顺序完全一致(a < b < ... < z),你代码里s1[0] < s2[0]的判断没有问题。以错误用例为例:

  • 第一步:s1[0] = 'e',s2[0] = 'o','e' < 'o',取'e',符合逻辑。
  • 第二步:s1剩余'nbvszyppzyiydnc',首字符'n',s2首字符'o','n' < 'o',应该取'n',这和你代码的输出一致,但和你所说的“正确输出”矛盾。

这说明要么是你误解了题目要求,要么是所谓的“正确输出”不符合题目描述。

2. 可能的题目误解

如果错误用例的输出确实是正确的,那题目实际要求大概率不是“取首字符更小的”,而是合并出字典序最小的字符串。这种场景下不能仅比较单个首字符,需要比较两个剩余字符串的整体拼接结果:每次选择s1 + s2和s2 + s1中字典序更小的那个,取对应字符串的首字符。

修改后的代码示例:

def solution(s1, s2):
    res = []
    while s1 and s2:
        # 比较剩余字符串拼接后的整体字典序,选择更小的一方的首字符
        if s1 + s2 < s2 + s1:
            res.append(s1[0])
            s1 = s1[1:]
        else:
            res.append(s2[0])
            s2 = s2[1:]
    return ''.join(res) + s1 + s2

不过需要注意,这种逻辑下错误用例的第二步仍然会取'n',和你提到的“正确输出”不符,这说明你所说的“正确输出”可能并不符合“最小字典序”要求,或者题目存在其他隐藏条件。

3. 代码优化建议

你的代码逻辑正确,但list.remove(s1[0])效率较低(需要遍历列表查找元素),可以直接操作字符串来简化实现,同时提升效率:

def solution(s1, s2):
    res = []
    while s1 and s2:
        if s1[0] < s2[0]:
            res.append(s1[0])
            s1 = s1[1:]
        else:
            res.append(s2[0])
            s2 = s2[1:]
    return ''.join(res) + s1 + s2

这段代码和你的逻辑完全一致,但避免了列表转换和remove操作,更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:50:17