1. Problem Statement (Simple Explanation):
You are given a valid Roman numeral string s (value in [1, 3999]).
You must convert it to its integer value.
Roman symbols and values:
Roman numerals are usually written from largest to smallest left to right, except for specific subtractive cases:
IV = 4 (5 − 1)
IX = 9 (10 − 1)
XL = 40 (50 − 10)
XC = 90 (100 − 10)
CD = 400 (500 − 100)
CM = 900 (1000 − 100)
2. Examples:
Example 1:
Input: s = "III"
Output: 3
Explanation: III = 1 + 1 + 1 = 3.
Example 2:
Input: s = "LVIII"
Output: 58
Explanation:
L = 50
V = 5
III = 3
Total = 50 + 5 + 3 = 58.
Example 3:
Input: s = "MCMXCIV"
Output: 1994
Explanation:
M = 1000
CM = 900
XC = 90
IV = 4
Total = 1000 + 900 + 90 + 4 = 1994.
3. Approach – Left-to-Right with Subtraction Rule:
Intuition:
We process the string from left to right:
Convert each Roman character to its value.
Normally, we add the value.
But when a smaller value appears before a larger value, it means subtraction (e.g., IV, IX, XL, etc.).
So for each position i:
Compare value(s[i]) with value(s[i+1]):
If value(s[i]) < value(s[i+1]), subtract value(s[i]).
Else, add value(s[i]).
This automatically handles all six subtractive cases given the input is guaranteed valid.
Algorithm (Step-by-Step):
Build a mapping from Roman characters to integer values.
Initialize result = 0.
Loop over index i from 0 to len(s) - 1:
Let current = value(s[i]).
if i + 1 < len(s), let next = value(s[i + 1]), else next = 0 (or treat as no next).
if current < next:
result -= current (subtractive case)
else:
result += current.
Return result.
Pseudo-code:
Complexity:
Let n (up to 15):
Time: O(1)
Space: O(1) (fixed-size map)
4. Java code:
5. C code:






Comments
Post a Comment