【LeetCode】500. 鍵盤行
阿新 • • 發佈:2018-11-03
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]);
}
}