C++实现手机按键输出所有可能的单词


在这个问题中,我们给定一个数字,需要打印出使用老式手机键盘按键组合可以形成的所有单词。

我们现在都很熟悉QWERTY键盘样式。但在QWERTY键盘发明之前,按键电话配备的是12个按键的键盘,每个按键包含单词和数字。例如,键盘上的数字6包含单词“MNO”,可以通过点击一次、两次或三次按键来输入。

键盘看起来像这样:

12
ABC
3
DEF
4
GHI
5
JKL
6
MNO
7
PQRS
8
TUV
9
WXYZ
*0#

在这些按键中也包含所有单词,用户可以使用它们进行输入。因此,在这个问题中,我们将打印出使用给定的数字序列可以生成的所有可能的单词。

让我们来看一个例子,以便更好地理解这个问题:

Input: 687
Output: MTP, MTQ, MTR, MTR, MUP, MUQ, MUR, MUS, MVP, MVQ,
MVR, MVR, NTP, NTQ, NTR, NTR, NUP, NUQ, NUR, NUS, NVP, NVQ,
NVR, NVR, OTP, OTQ, OTR, OTR, OUP, OUQ, OUR, OUS, OVP, OVQ,
OVR, OVR.

为了解决这个问题,让我们看看上面例子中的模式。每个按键都有其关联的字符,我们在输入时必须使用它们。因此,对于每个数字,最多有4个选项(对于7和9)。为此,我们可以固定一个数字,然后使用该数字生成单词。这可以使用递归来完成。

让我们来看一个使用递归实现该概念的程序。

示例

在线演示

#include <iostream>
#include <string.h>
using namespace std;
const char keypad[10][5] = {"", "", "abc", "def", "ghi", "jkl", "mno",
"pqrs", "tuv", "wxyz"};
void printWords(int number[], int curr_digit, char output[], int n){
   int i;
   if (curr_digit == n){
      cout<<output<<" ";
      return ;
   }
   for (i=0; i<strlen(keypad[number[curr_digit]]); i++){
      output[curr_digit] = keypad[number[curr_digit]][i];
      printWords(number, curr_digit+1, output, n);
      if (number[curr_digit] == 0 || number[curr_digit] == 1)
         return;
   }
}
int main(void){
   int number[] = {6,8,7};
   cout<<"The output character formed is : \n";
   int n = sizeof(number)/sizeof(number[0]);
   char result[n+1];
   result[n] ='\0';
   printWords(number, 0, result, n);
   return 0;
}

输出

生成的输出字符是:

mtp mtq mtr mts mup muq mur mus mvp mvq mvr mvs ntp ntq ntr nts
nup nuq nur nus nvp nvq nvr nvs otp otq otr ots oup ouq our ous ovp
ovq ovr ovs

更新于:2020年1月17日

763 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.