(1) Decode Ways
第一: s[i-1]不能是0,如果s[i-1]是0的话,number[i]就只能等于number[i-2]
第二,s[i-2,i-1]中的第一个字符不能是0,而且Integer.parseInt(s.substring(i-2,i))获得的整数必须在0到26之间。[1]
class Solution {
private:
bool isValid(string s) {
if(s[0]=='0')
return false;
int i=atoi(s.c_str());
return i>=1 && i<=26;
}
public:
int numDecodings(string s) {
int n=s.size();
if(n==0)
return 0;
vector<int> dp(n+1,0);
dp[0]=1;
if(isValid(s.substr(0,1)))
dp[1]=1;
for(int i=2;i<=n;i++)
{
if(isValid(s.substr(i-1,1)))
dp[i]=dp[i-1];
if(isValid(s.substr(i-2,2)))
dp[i]+=dp[i-2];
}
return dp[n];
}
};
(2) String to Integer
注意一些题目提示的细节即可:
class Solution {
public:
int atoi(const char *str) {
if(str==NULL)
return 0;
while(*str==' ')
str++;
long long ret=0;
int flag=(*str=='-') ? -1 : 1;
if(*str=='-' || *str=='+')
str++;
while(*str!='\0')
{
if(*str>='0' && *str<='9')
{
ret=ret*10+*str-'0';
if(flag==1 && ret>INT_MAX)
return INT_MAX;
if(flag==-1 && -ret<INT_MIN)
return INT_MIN ;
str++;
}
else
break;
}
return flag*ret;
}
};
为了防止溢出ret用了long long型,有种只用int型和其他小技巧防止溢出的方法[2]。
(3) Reverse Words in a String
挺简单的,不知道为啥AC率这么低。。。
class Solution {
public:
void reverseWords(string &s) {
if(s.size()==0)
return;
vector<string> ret;
string tmp;
tmp.clear();
for(int i=0;i<s.size();i++)
{
if(s[i]==' ')
{
if(tmp.size()>0)
{
ret.push_back(tmp);
tmp.clear();
}
}
else
tmp.push_back(s[i]);
}
if(tmp.size()>0)
ret.push_back(tmp);
s.clear();
if(ret.size()==0)
return;
for(int i=ret.size()-1;i>=0;i--)
s=s+ret[i]+' ';
s.pop_back();
}
};
参考:
[1] http://blog.youkuaiyun.com/worldwindjp/article/details/19938131
[2] http://blog.youkuaiyun.com/ithomer/article/details/8800530