用 C++ 解码给定消息的程序
假设我们得到一个编码消息,它是一串整数。现在,这些整数可以映射到字母表中的特定字母。a映射到1,b映射到2,c映射到3,依此类推。还有一个字符“*”可以出现在消息中,并且可以映射到从1到9的任何数字。因此,给定消息“输入”,我们必须找出可以对其进行解码的方式。
因此,如果输入类似于input="18",那么输出将为2。
消息可以解码为“ah”,因为1映射到“a”,8映射到“h”。此外,数字可以映射到“r”,因为18映射到“r”。所以。总共有2种方法可以对输入进行解码。
示例
让我们看看以下实现以获得更好的理解-
#include<bits/stdc++.h>
using namespace std;
const long m = 1e9 + 7;
int solve(string input) {
int n = input.length();
long long dynArr[n + 1] = {0};
bool p = 1;
char k = '0';
dynArr[0] = 1;
for (int i = 1; i <= n; i++) {
char c = input[i - 1];
if (c == 0 && !(k == '1' || k == '2' || k == '*')) {
p = 0;
break;
}
if (input[i - 1] == '*') {
dynArr[i] = (dynArr[i - 1] * 9) % m;
if (k == '1' || k == '*') dynArr[i] = (dynArr[i] + dynArr[i - 2] * 9) % m;
if (k == '2' || k == '*') dynArr[i] = (dynArr[i] + (dynArr[i - 2] * 6) % m) % m;
} else {
if (c != '0') dynArr[i] = dynArr[i - 1];
if (k == '1' || k == '*') dynArr[i] = (dynArr[i] + dynArr[i - 2]) % m;
if ((k == '2' || k == '*') && input[i - 1] <= '6') dynArr[i] = (dynArr[i] + (dynArr[i - 2]) % m) % m;
}
k = c;
}
return p ? dynArr[n] : 0;
}
int main() {
cout<< solve("18") <<endl;
return 0;
}输入
18输出结果
2