方法1:
class Solution {
public:
int romanToInt(string s) {
vector<char> Roman={'I','V','X','L','C','D','M'};
vector<int> dig={1,5,10,50,100,500,1000};
map<string,int> mp;
int n=dig.size();
int i,j;
int m=s.size();
int ans=0;
for(i=1;i<n;i++)
{
string tmp="";
if(dig[i]==10||dig[i]==100||dig[i]==1000)
{
tmp+=Roman[i-2];
tmp+=Roman[i];
mp[tmp]=dig[i]-dig[i-2];
}
else
{
tmp+=Roman[i-1];
tmp+=Roman[i];
mp[tmp]=dig[i]-dig[i-1];
}
}
for(i=0;i<m;)
{
if(i<m-1&&mp.find(s.substr(i,2))!=mp.end())
{
ans+=mp[s.substr(i,2)];
i+=2;
}
else
{
for(j=0;j<n;j++)
{
if(s[i]==Roman[j])
{
ans+=dig[j];
break;
}
}
i++;
}
}
return ans;
}
};
方法2:
可以简化为若当前罗马数字小于下一位罗马数字,则减去当前数字
class Solution {
public:
int romanToInt(string s) {
vector<char> Roman={'I','V','X','L','C','D','M'};
vector<int> dig={1,5,10,50,100,500,1000};
map<char,int> mp;
int i;
for(i=0;i<dig.size();i++)
mp.insert(std::pair<char,int>(Roman[i],dig[i]));
int n=s.size();
if(n==0)
return 0;
int ans=0;
for(i=0;i<n-1;i++)
{
if(mp[s[i]]<mp[s[i+1]])
ans-=mp[s[i]];
else
ans+=mp[s[i]];
}
ans+=mp[s[i]];
return ans;
}
};