题意:a用1表示,b用2表示,。。。z用26表示;请问对给定的一串数字,说明有几种解码成字母的方式。例如,123可解码成abc,lc,aw三种方式。
分析:此问题有最右子问题,即如果当前位i和前一位i-1能组成小于等于26的两位数,那么前i个数字的解码方式等于前i-2个数字的解码方式加上前i-1个数字的解码方式之和;否则,前i个数字的解码方式就等于前i-1个数字的解码方式。
代码:
int WaysOfDecode(string s){
if(s.size()==0)
return 0;
if(s.size()==1&&CheckCurrentOneChar(s[0]))
return 1;
else if(s.size()==1&&!CheckCurrentOneChar(s[0]))
return 0;
vector<int> ways(s.size(),0);
ways[0]=1;
if(CheckCurrentOneChar(s[1])){
if(CheckCurrentTwoChar(s[0],s[1]))
ways[1]=2;
else
ways[1]=1;
}
else
return 0;
for(int i=2;i<s.size();++i){
if(!CheckCurrentOneChar(s[i]))
return 0;
if(CheckCurrentTwoChar(s[i-1],s[i]))
ways[i]=ways[i-1]+ways[i-2];
else
ways[i]=ways[i-1];
}
return ways[s.size()-1];
}
bool CheckCurrentOneChar(char currentChar){//是否为数字
if(currentChar>='1'&¤tChar<='26')
return true;
else
return false;
}
bool CheckCurrentTwoChar(char lastChar,char currentChar){//和前一个数是否能组成小于等于26的两位数
if(lastChar=='1'||lastChar=='2'&¤tChar<='6')
return true;
else
return false;
}