思路:首先提前存好每个字符和对应的数字
如:MCMXCIV
先比较第一个字符M,找到对应的vector位置和对应的数字,此时看第二给数字MC是否和vector中的串匹配
若不比配,先记下M=1000,若匹配则记录对应值,遇到C找到对应100,CM匹配900,则记录900,XC匹配90,IV匹配4
总计:1994
class Solution {
public:
void priVector(vector<pair<string, int>>& s) {
s.push_back(make_pair("I", 1));
s.push_back(make_pair("IV", 4));//1
s.push_back(make_pair("V", 5));
s.push_back(make_pair("IX", 9));//3
s.push_back(make_pair("X", 10));
s.push_back(make_pair("XL", 40));//5
s.push_back(make_pair("L", 50));
s.push_back(make_pair("XC", 90));//7
s.push_back(make_pair("C", 100));
s.push_back(make_pair("CD", 400));//9
s.push_back(make_pair("D", 500));
s.push_back(make_pair("CM", 900));//11
s.push_back(make_pair("M", 1000));
//先提前存好
//6种特殊是IV IX XL XC CD CM
}
int romanToInt(string s) {
vector<pair<string, int>>p;
priVector(p);
int i;
int res=0;
for (i=0; i < s.size(); i++) {//从0到s串末尾
for (int j = p.size() - 1; j >= 0; j--) {
if (!s.substr(i, 1).compare(p[j].first)) {//与当前数匹配
if (j+1< p.size() - 1 &&!s.substr(i, 2).compare(p[j+1].first)) {//继续2位匹配
res+= p[j+1].second;
i++;
}
else if (j + 3 < p.size() - 1&&!s.substr(i, 2).compare(p[j + 3].first)) {
res += p[j + 3].second;
i++;
}
else
res += p[j].second;
break;
}
}
}
return res;
}
};