题解

题目难度:中等

知识点:ASCII码、递归、DFS

解题思路:首先,这道题一看就主要考察DFS,使用递归就可以求解出题。然后,因为涉及到数字和字符的转换,这个自然就会联想到ASCII码。整体思路还是比较清晰的,主要还需要考虑涉及到一些特殊情况。首先,“0”这个数字在转换过程中需要怎么考虑。因为不可能单独存在一个“0”进行转换,所以必须让它和之前的字符合并起来进行计算;然后,还需要考虑到字母的数量极限,因为一共有26个字母,所以这里一旦数字大于26时,是必须拆分的,只能作为一个单独位进行处理。所以,在考虑完这些情况后,整体思路就比较清晰了。

#include<iostream>
#include<string>
#include<vector>
using namespace std;
//创建一个方法来实现破解
void DFS(string s,int i,string res,vector<string> &tmp)
{
    if(i==s.size()-1)
    {
        res+=char(s[i]+48);
        tmp.push_back(res);
        return;
    }
    if(i>s.size()-1)
    {
        tmp.push_back(res);
        return;
    }
    //一共26个字母,所以以26为界
    if((s[i]-48)*10+(s[i+1]-48)>26)
    {
        res+=char(s[i]+48);
        DFS(s,i+1,res,tmp);
    }
    else{
        string temp=res;
        res+=char(s[i]+48);
        //如果下一位是'0',则不能单独作为一位来分割
        if(s[i+1]!='0')
            DFS(s,i+1,res,tmp);
        res=temp+char(((s[i]-48)*10+(s[i+1]-48))+96);
        //这里还有一个特殊情况,如果剩下s[i+2]为'0'时,也会出现对'0'进行破解的局面
        //此外,还要考虑当i==s.size()-2时,i+2是否已经越界
        if(i==s.size()-2)
            DFS(s,i+2,res,tmp);
        else if(s[i+2]!='0')
            DFS(s,i+2,res,tmp);
    }

}
int main()
{
    string s;
    while(cin>>s)
    {
        vector<string> secret;
        DFS(s,0,"",secret);
        for(int i=0;i<secret.size();i++)
        {
            cout<<secret[i]<<' ';
        }
        cout<<endl;
    }
}