用 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

猜你喜欢