1.题目
给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。
键盘行题目
2.思路
step1:建立一个map容器,容器中存放键盘中的三行,每行数据对应一个value。
step2:遍历vector向量中的元素,遍历字符串元素中的每一个字母。
step3:对首字母进行判断,先将大写变成小写,判断首字母在map中对应value,将值存入first中。
step4:继续遍历接下来的字母,如果字母对应value与first不一致,则证明不在同一行,flag=false。
step5:判断flag的值,把true的添加到向量v中最后返回主函数。
3.代码
vector<string> findWords(vector<string>& words){
int len=words.size();
if(len==0)
return {};
map<char,int>mp;
vector<string> v;
mp['q'] = 1;mp['w'] = 1;mp['e'] = 1;mp['r'] = 1;mp['t'] = 1;mp['y'] = 1;mp['u'] = 1; mp['i'] = 1;mp['o'] = 1;mp['p'] = 1;
mp['a'] = 2;mp['s'] = 2;mp['d'] = 2;mp['f'] = 2;mp['g'] = 2;mp['h'] = 2;mp['j'] = 2; mp['k'] = 2;mp['l'] = 2;
mp['z'] = 3;mp['x'] = 3;mp['c'] = 3;mp['v'] = 3;mp['b'] = 3;mp['n'] = 3;mp['m'] = 3;
int first=0;
bool flag=true;
for(int i=0;i<len;i++){
flag=true;
first=0;
for(int j=0;j<words[i].size();j++){
if(!first){
if(words[i][j]<'a')
first=mp[words[i][j]+32];
else first=mp[words[i][j]];
}
else if(words[i][j] < 'a'){
if(mp[words[i][j] + 32] != first){
flag= false;
break;
}
}
else if(mp[words[i][j]] != first){
flag = false;
break;
}
}
if(flag)
v.push_back(words[i]);
}
return v;
}
4.优秀案例
不利用map容器,直接体用数组存放对应字母所在行
vector<string> findWords(vector<string>& words) {
vector<string> res;
if(words.size()==0)return res;
int a[26]={2,1,1,2,3,2,2,2,3,2,2,2,1,1,3,3,3,3,2,3,3,1,3,1,3,1};
//把26个字母对应的行数存放在数组a中
for(int i=0;i<words.size();i++)
{
int ok=1;
int count;
if(words[i][0]>'Z')
{
count=a[words[i][0]-97];//小写字母
}
else
{
count=a[words[i][0]-65];//大写字母
}
//count用于存放首字母对应行
for(int j=1;j<words[i].length();j++)
{
if(words[i][j]>'Z')
{
if(a[words[i][j]-97]!=count)//后面字母与首字母不在一行
{
ok=0;
break;
}
}
else
{
if(a[words[i][j]-65]!=count)
{
ok=0;
break;
}
}
}
if(ok)
{
res.push_back(words[i]);
}
}