Given a List of words, return the words that can be typed using letters of alphabet on only one row's of American keyboard like the image below.
Example 1:
Input: ["Hello", "Alaska", "Dad", "Peace"] Output: ["Alaska", "Dad"]
Note:
- You may use one character in the keyboard more than once.
- You may assume the input string will only contain letters of alphabet.
Solution 1: use unordered_map, if each char's value in a word equal the value of the first char, the word can be typed using the letters in the same row.
1 class Solution { 2 public: 3 vector<string> findWords(vector<string>& words) { 4 unordered_map<char,int> m={{'Q',0},{'W',0},{'E',0},{'R',0},{'T',0},{'Y',0},{'U',0},{'I',0},{'O',0},{'P',0}, 5 {'A',1},{'S',1},{'D',1},{'F',1},{'G',1},{'H',1},{'J',1},{'K',1},{'L',1}, 6 {'Z',2},{'X',2},{'C',2},{'V',2},{'B',2},{'N',2},{'M',2}}; 7 vector<string> res; 8 for (string word: words){ 9 int i; 10 char firstletter=word[0]<='z'&&word[0]>='a'?word[0]-32:word[0]; 11 for (i=1;i<word.length();i++){ 12 if(m[word[i]<='z'&&word[i]>='a'?word[i]-32:word[i]]!=m[firstletter]){ 13 break; 14 } 15 } 16 if (i==word.length()){ 17 res.push_back(word); 18 } 19 } 20 return res; 21 } 22 };
Solution 2: use unordered_set
1 class Solution { 2 public: 3 vector<string> findWords(vector<string>& words) { 4 unordered_set<char> row1={'Q','W','E','R','T','Y','U','I','O','P'}; 5 unordered_set<char> row2={'A','S','D','F','G','H','J','K','L'}; 6 unordered_set<char> row3={'Z','X','C','V','B','N','M'}; 7 vector<string> res; 8 for(string word:words){ 9 int one=0,two=0,three=0; 10 for(char c:word){ 11 c=(c>='a')?c-32:c; 12 if (row1.count(c)) one = 1;//can't use one=row1.count(c),because we need to save the previous value of one 13 if (row2.count(c)) two = 1; 14 if (row3.count(c)) three = 1; 15 if (one+two+three>1) break; 16 } 17 if (one+two+three==1) res.push_back(word); 18 } 19 return res; 20 } 21 };