#include #include typedef std::map RomanNumeral; class RomanToIntegerSolution { private: RomanNumeral numTable; public: int romanToInt(std::string s) { unsigned long roman(0); std::string remainder; remainder.resize(s.length()); unsigned long singleRomanNumerals[255]; singleRomanNumerals['I'] = 1; singleRomanNumerals['V'] = 5; singleRomanNumerals['X'] = 10; singleRomanNumerals['L'] = 50; singleRomanNumerals['C'] = 100; singleRomanNumerals['D'] = 500; singleRomanNumerals['M'] = 1000; numTable["IV"] = 4; numTable["IX"] = 9; numTable["XL"] = 40; numTable["XC"] = 90; numTable["CD"] = 400; numTable["CM"] = 900; auto len(s.length()); unsigned long j(0); unsigned long i = 0; for ( ; i < len-1; i++ ) { char str[3]; str[0] = s[i]; str[1] = s[i+1]; str[2] = 0; auto it(numTable.find(str)); if (it != numTable.end()) { roman += it->second; i++; } else { remainder[j++] = s[i]; remainder[j] = 0; } } if ( i < len ) { remainder[j++] = s[i]; remainder[j] = 0; } for (i = 0; (i < remainder.length()) && (remainder[i] != 0); i++) { roman += singleRomanNumerals[remainder[i]]; } return roman; } };