题目描述
假设你有一个T9手机键盘,其中每个键可能代表多个字符(如2代表’a’,‘b’,‘c’)。给出一个数字序列,要求你输出所有可能的字符串组成。
输入格式
第一行是一个整数n,表示数字序列的长度。
第二行是一个字符串s,其中s[i]是第i个数字。
输出格式
所有可能的字符串,每个字符串占一行。
约束
1<=n<=12
s[i]是’0’到’9’之间的一个字符。
样例
输入
3
234
输出
adg
adh
adi
aeg
aeh
aei
afg
afh
afi
bdg
bdh
bdi
beg
beh
bei
bfg
bfh
bfi
cdg
cdh
cdi
ceg
ceh
cei
cfg
cfh
cfi
算法:(深度优先搜索+字符串模拟) O ( 3 n ) O(3^n) O(3n)
C++ 标程
#include<iostream>
#include<cstring>
using namespace std;
const char num[10][5]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
string s;
void dfs(string s,string ans,int i){
if(i==s.size()){
cout<<ans<<endl;
return;
}
for(int j=0;j<strlen(num[s[i]-'0']);j++)
dfs(s,ans+num[s[i]-'0'][j],i+1);
}
int main(){
cin>>s;
dfs(s,"",0);
return 0;
}
说明
- 时间复杂度: O ( 3 n ) O(3^n) O(3n), 空间复杂度 O ( n ) O(n) O(n)
- 题目要求我们枚举所有可能的字符串,那么我们可以使用深度优先搜索来枚举所有的情况。在深度优先搜索中,我们使用两个参数,一个是原始的数字串s,另一个是当前已经搜索到的字符串ans,每次搜索到一个数字,我们就遍历其对应的所有字符,并将其添加到ans字符串中,然后继续搜索下一个数字,直到所有的数字都搜索完毕,输出ans字符串即可。代码中使用了一个num数组,用来存储每个数字对应的字符。该算法的时间复杂度为 O ( 3 n ) O(3^n) O(3n), 空间复杂度 O ( n ) O(n) O(n) 。