LeetCode 500 Keyboard Row
C代碼版。
題目大意:給一串單詞,找出所有字母全在美式鍵盤一行中的那些單詞。
例如:單詞“Alaska”,其所有字母:“A”,"a","l","s","k",全在美式鍵盤中的第3行,滿足條件;
而單詞“Hello”,其所有字母:“H”,“e”,"l","o",“H”和“l”在第3行,而“e”和“o”在第2行,所以不滿足條件。
題目很簡單,沒什麼難度;如果用C的話,主要是考指針以及二級指針的用法,另外值得注意的一點是,需注意字符的大小寫。
C版本代碼如下,僅供參考(爲了在LeetCode上提交方便,沒有使用全局變量;提交時,只需提交“findCharInKeyBoardRow()”和“findWords()”這兩個函數即可)。
#define LOCAL
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int findCharInKeyBoardRow(char c, char** keyBoardStr, int KBDNUM){
c = tolower(c);
int i,j;
for(i=0;i<KBDNUM;i++){
for(j=0;j<strlen(keyBoardStr[i]);j++){
if(c==keyBoardStr[i][j])
return i;
}
}
return -1;
}
char** findWords(char** words, int wordsSize, int* returnSize){
int MAXSTR,MAXLEN,KBDNUM;
MAXSTR=100;
MAXLEN=100;
KBDNUM=3;
char* keyBoardStr[]={"qwertyuiop","asdfghjkl","zxcvbnm"};
int i,j,rowPos,flag;
*returnSize=0;
char** inRows=(char**)malloc(wordsSize*sizeof(char*));
if(inRows==NULL)
return NULL;
for(i=0;i<wordsSize;i++)
inRows[i]=(char*)malloc(MAXLEN*sizeof(char));
for(i=0;i<wordsSize;i++){
rowPos=findCharInKeyBoardRow(words[i][0],keyBoardStr,KBDNUM);
flag=1;
for(j=1;j<strlen(words[i]);j++){
if(rowPos!=findCharInKeyBoardRow(words[i][j],keyBoardStr,KBDNUM)){
flag=0;
break;
}
}
if(flag){
strcpy(inRows[*returnSize],words[i]);
(*returnSize)++;
}
}
return inRows;
}
int main(){
#ifdef LOCAL
freopen("500_input.txt","r",stdin);
freopen("500_output.txt","w",stdout);
#endif
int MAXSTR,MAXLEN,KBDNUM;
MAXSTR=100;
MAXLEN=100;
KBDNUM=3;
int i,wordsSize,returnSize;
// initiate.
wordsSize=0;
char** words=(char**)malloc(MAXSTR*sizeof(char*));
char ** INROWS=NULL;
if(words==NULL)
return 1;
for(i=0;i<MAXSTR;i++)
words[i]=(char*)malloc(MAXLEN*sizeof(char));
// fill string.
while(scanf("%s",words[wordsSize])==1)
wordsSize++;
// call function findWords.
INROWS=findWords(words, wordsSize, &returnSize);
for(i=0;i<returnSize;i++)
printf("%s\n",INROWS[i]);
// free space.
for(i=0;i<MAXSTR;i++)
free(words[i]);
free(words);
return 0;
}