Leetcode: Roman to Integer

题意

将罗马字符串转化成对应的数字

思路

  1. 创建一个hash表, 记录每一个或两个罗马符号对应的数字的值
  2. 对输入的罗马字符串进行匹配. 匹配的时候需要一步lookahead操作, 优先匹配长度为2的罗马符号

总结

  1. unordered_map<string, int> 不可使用map.find(string[i])操作, 因为string[i] 是一个 char. 正确的操作应当是 map.find(string.substr(2,1))
  2. map 的find操作返回map.end() 或者指向目标pair的指针, 可用 map.find(xx)->first/second 返回pair的值

代码

  

 1 #include <iostream>
 2 #include <string>
 3 #include <unordered_map>
 4 using namespace std;
 5 int con[13] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
 6 string rom[13] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
 7 unordered_map<string, int> RTI;
 8 class Solution {
 9 public:
10     int romanToInt(string s) {
11         // IMPORTANT: Please reset any member data you declared, as
12         // the same Solution instance will be reused for each test case.
13         for(int i = 0; i < 13; i ++)
14             RTI.insert(make_pair(rom[i], con[i]));
15         int res = 0;
16         for(int i = 0; i < s.size(); i ++) {
17             if(i+1<s.size()) {
18                 string temp = s.substr(i, 2);
19                 if(RTI.find(temp) != RTI.end()) {
20                     res += RTI.find(temp)->second;
21                     i++;
22                 }else{
23                     res += RTI.find(s.substr(i,1))->second;
24                 }
25             }else{
26                 res += RTI.find(s.substr(i,1))->second;
27             }
28             
29         }
30         return res;
31     }
32 };

 

posted @ 2013-11-17 10:48  SangS  阅读(220)  评论(0编辑  收藏  举报