题目:
在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表。每个数字映射到0至4个字母。给定一个数字序列,实现一个算法来返回匹配单词的列表。你会得到一张含有有效单词的列表。映射如下图所示:
示例:
输入: num = "8733", words = ["tree", "used"]
输出: ["tree", "used"]
输入: num = "2", words = ["a", "b", "c", "d"]
输出: ["a", "b", "c"]
解题思路:
1.先通过一个一维数组保存26个字母与键盘上0-9数字的映射关系(从键盘可以看出0和1不参与),所以数组起始元素从2开始
2.遍历整数字符串,把整数字符串中的每个字符与字符串中的每个字符一一对应的从字符类型转为整型,判断是否可以匹配得上
3.前提:字符串的长度需要与num的长度相同,否则一定不能匹配成功
Code:
cpp
class Solution {
public:
bool ismatch(string num, string word)
{
//将9键键盘上的数字与字母的映射关系,用一维数字表示出来
int arr[26]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};
//判断当前word是否与num匹配
for(int i=0;i<word.size();i++)
{
int index=word[i]-'a';//将字符转成整型,'a'->0,'b'->1
int data=num[i]-'0';//字符串num中的字符转成数字
//如果出现不相等,说明不匹配,直接返回false
if(data!=arr[index])
{
return false;
}
}
//每个字符都对应成功,返回true
return true;
}
vector<string> getValidT9Words(string num,vector<string>& words) {
vector<string> res;//定义结果数组
if(num.size()==0 ||words.size()==0) return res;//判空
int n=num.size();
//遍历字符串数组words
for(auto& word:words)
{
//字符串数组中每个单词的长度必须与数字序列的长度相等,否则一定不匹配
if(word.size()==n)
{
//如果匹配结果为真
if(ismatch(num,word))
{
//将word加入结果数组中
res.push_back(word);
}
}
}
//返回结果数组
return res;
}
};