题目背景
罗马数字由七个符号组成:I, V, X, L, C, D, M。通常从大到小排列,但存在特例,如 IV 表示 4,IX 表示 9。这类减法原则共有六种情况:I 前置于 V/X,X 前置于 L/C,C 前置于 D/M。本题要求将给定的罗马数字字符串转换为整数,输入范围在 1 到 3999 之间。
解题思路
核心难点在于识别减法组合。如果简单地从左到右遍历相加,遇到 IV 会算成 1+5=6,导致错误。因此需要优先检查当前字符是否与下一个字符构成特殊组合。
我们可以建立一个哈希表,既包含单个字符的映射,也包含两个字符的组合映射(如 IV:4)。遍历时,先尝试匹配长度为 2 的子串,如果在表中存在,则加上对应的值并将索引后移两位;否则匹配长度为 1 的子串,加上值后索引后移一位。这样就能自然覆盖所有情况,包括普通加法组合和特殊减法组合。
代码实现
class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
# 建立映射表,包含单字符及特殊双字符组合
d = {
'I': 1, 'V': 5, 'X': 10, 'L': 50,
'C': 100, 'D': 500, 'M': 1000,
'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90,
'CD': 400, 'CM': 900
}
res = 0
i = 0
n = len(s)
while i < n:
# 优先检查是否存在双字符组合
if i + 1 < n s[i:i+] d:
res += d[s[i:i+]]
i +=
:
res += d[s[i]]
i +=
res

