我觉得这个就是简单的前进问题,用不到动态规划,只是向前前进几个值就可以了。多用几个if,遇见特殊的向前多检查几个字符,就是这样。
看看网上的,网上的方法就是构建出所有的子字符串数据,然后按照最大匹配原则匹配出来,真的牛。从没有规律的地方发现规律,从而简化代码。
总的数字有 I II III ,可以转化成一个I,77
IV,IX 4,9 77+86=163,77+88=165
XL,XC, 40,90 88+76=164,88+67=155
CD,CM 400, 900,67+68=135,67+77=144
在ascii码表中,I为73,V为86,X为88,L为76,C为67,D为68,M为77
因此划分一个200的数组就足够了
每次提取时,如果后面的字符比较大,那么它就是一个负数这样。但是需要注意的是不能有不合规矩的数。但此题是没有的。
成功了,真简单。
class Solution {
public:
int romanToInt(string s) {
int arr[200];
arr['I'] = 1;
arr['V'] = 5;
arr['X'] = 10;
arr['L'] = 50;
arr['C'] = 100;
arr['D'] = 500;
arr['M'] = 1000;
int res = 0;
int n = s.size();
if(n == 0) return 0;
for(int i=0; i<n; i++){
if((i!=n-1) && (arr[s[i+1]]>arr[s[i]])){ // 如果后面的数比前面的数大
res += arr[s[i]]*(-1);
}
else{
res += arr[s[i]];
}
}
return res;
}
};
来源:https://blog.csdn.net/HeroIsUseless/article/details/102775255