69,382
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <string.h>
#define MAX 500
/×
a,b,...,z map to 1,2,...,26
num is a string composed by 1~9
×/
char num[MAX], letter[MAX];
int lenOfNum;
void dfs(int nextOfLetter, int nextOfNum)
{
int twoDigits;
if(nextOfNum == lenOfNum){
letter[nextOfLetter] = 0;
puts(letter);
return;
}
//one digit definitely matches a letter
letter[nextOfLetter] = num[nextOfNum] - '1' + 'a';
dfs(nextOfLetter+1, nextOfNum+1);
//check if next two digits can match a letter
if(nextOfNum+1 < lenOfNum){
twoDigits = (num[nextOfNum] - '0') * 10 + (num[nextOfNum+1] - '0');
if(twoDigits < 27){
letter[nextOfLetter] = twoDigits-1 + 'a';
dfs(nextOfLetter+1, nextOfNum+2);
}
}
}
int main()
{
while(gets(num)){
lenOfNum = strlen(num);
dfs(0, 0);
}
return 0;
}
不知道dp能不能做,
用f(num, lenOfNum)表示num对应的字母串,则
f(num, lenOfNum) = f(num, i) + f(num+i, lenOfNum)
判重麻烦了就,记忆也是个问题
int explainInput(string s, int* a[])
{
if (s.length() == 0)
{
return 0;
}
else if (s.length() == 1)
{
a[0] = new int[2];
a[0][0] = 1;
a[0][1] = s[0] - '0';
return 1;
}
int ret = explainInput(s.substr(1), a);
int head = s[0] - '0';
int rise = 0;
for (int n = 0; n < ret; ++n)
{
if (a[n] != nullptr)
{
a[ret+rise] = new int[a[n][0]+2];
a[ret+rise][0] = a[n][0] + 1;
a[ret+rise][1] = s[0] - '0';
for (int k = 1; k <= a[n][0]; ++k)
{
a[ret+rise][k+1] = a[n][k];
}
++rise;
if ((a[n][1] <= 6 && head == 2) || (a[n][1] < 10 && head == 1))
{
a[ret+rise] = new int[a[n][0]+1];
a[ret+rise][0] = a[n][0];
a[ret+rise][1] = head * 10 + a[n][1];
for (int k = 2; k <= a[n][0]; ++k)
{
a[ret+rise][k] = a[n][k];
}
++rise;
}
delete[] a[n];
a[n] = nullptr;
}
}
return ret+rise;
}
int _tmain(int argc, _TCHAR* argv[])
{
int* a[100];
int ret = explainInput("11111", a);
for (int j = 0; j < ret; ++j)
{
int* arr = a[j];
if (arr == nullptr)
{
continue;
}
for (int i = 1; i <= arr[0]; ++i)
{
cout << arr[i] << " ";
}
delete[] arr;
cout << endl;
}
}