Given an array of strings arr[], consisting of strings made up of lowercase and uppercase letters, the task is to print all the strings from the given array that can be typed using keys from a single row of a QWERTY keyboard.
Examples:
Input: arr[] = {“Yeti”, “Had”, “GFG”, “comment”}
Output: Yeti Had GFG
Explanation:
“Yeti” can be typed from the 1st row.
“Had” can be typed from the 2nd row.
“GFG” can be typed from the 2nd row.
Therefore, the required output is Yeti Had GFG.Input: arr[] = {“Geeks”, “for”, “Geeks”, “Pro”}
Output: Pro
Approach: The problem can be solved using Hashing. The idea is to traverse the array and for each string, check if all the characters of the string can be typed using the keys of the same row or not. Print the strings for which it is found to be true. Follow the steps below to solve the problem:
- Initialize a Map, say mp, to store for each character, the row number in the keyboard in which the key for that character is present.
- Traverse the array and for each string, check if all the characters of the string have the same row number assigned to it in the Map or not. If found to be true, then print the string.
Below is the implementation of the above approach:
// C++ program to implement // the above approach #include <bits/stdc++.h> using namespace std;
// Function to print all strings that // can be typed using keys of a single // row in a QWERTY Keyboard void findWordsSameRow(vector<string>& arr)
{ // Stores row number of all possible
// character of the strings
unordered_map< char , int > mp{
{ 'q' , 1 }, { 'w' , 1 }, { 'e' , 1 }, { 'r' , 1 },
{ 't' , 1 }, { 'y' , 1 }, { 'u' , 1 }, { 'o' , 1 },
{ 'p' , 1 }, { 'i' , 1 }, { 'a' , 2 }, { 's' , 2 },
{ 'd' , 2 }, { 'f' , 2 }, { 'g' , 2 }, { 'h' , 2 },
{ 'j' , 2 }, { 'k' , 2 }, { 'l' , 2 }, { 'z' , 3 },
{ 'x' , 3 }, { 'c' , 3 }, { 'v' , 3 }, { 'b' , 3 },
{ 'n' , 3 }, { 'm' , 3 }
};
// Traverse the array
for ( auto word : arr) {
// If current string is
// not an empty string
if (!word.empty()) {
// Sets true / false if a string
// can be typed using keys of a
// single row or not
bool flag = true ;
// Stores row number of the first
// character of current string
int rowNum
= mp[ tolower (word[0])];
// Stores length of word
int M = word.length();
// Traverse current string
for ( int i = 1; i < M; i++) {
// If current character can't be
// typed using keys of rowNum only
if (mp[ tolower (word[i])]
!= rowNum) {
// Update flag
flag = false ;
break ;
}
}
// If current string can be typed
// using keys from rowNum only
if (flag) {
// Print the string
cout << word << " " ;
}
}
}
} // Driver Code int main()
{ vector<string> words
= { "Yeti" , "Had" ,
"GFG" , "comment" };
findWordsSameRow(words);
} |
// Java program to implement // the above approach import java.io.*;
import java.util.*;
class GFG{
// Function to print all strings that // can be typed using keys of a single // row in a QWERTY Keyboard static void findWordsSameRow(List<String> arr)
{ // Stores row number of all possible
// character of the strings
Map<Character,
Integer> mp = new HashMap<Character,
Integer>();
mp.put( 'q' , 1 );
mp.put( 'w' , 1 );
mp.put( 'e' , 1 );
mp.put( 'r' , 1 );
mp.put( 't' , 1 );
mp.put( 'y' , 1 );
mp.put( 'u' , 1 );
mp.put( 'i' , 1 );
mp.put( 'o' , 1 );
mp.put( 'p' , 1 );
mp.put( 'a' , 2 );
mp.put( 's' , 2 );
mp.put( 'd' , 2 );
mp.put( 'f' , 2 );
mp.put( 'g' , 2 );
mp.put( 'h' , 2 );
mp.put( 'j' , 2 );
mp.put( 'k' , 2 );
mp.put( 'l' , 2 );
mp.put( 'z' , 3 );
mp.put( 'x' , 3 );
mp.put( 'c' , 3 );
mp.put( 'v' , 3 );
mp.put( 'b' , 3 );
mp.put( 'n' , 3 );
mp.put( 'm' , 3 );
// Traverse the array
for (String word : arr)
{
// If current string is
// not an empty string
if (word.length() != 0 )
{
// Sets true / false if a string
// can be typed using keys of a
// single row or not
boolean flag = true ;
// Stores row number of the first
// character of current string
int rowNum = mp.get(
Character.toLowerCase(word.charAt( 0 )));
// Stores length of word
int M = word.length();
// Traverse current string
for ( int i = 1 ; i < M; i++)
{
// If current character can't be
// typed using keys of rowNum only
if (mp.get(Character.toLowerCase(
word.charAt(i))) != rowNum)
{
// Update flag
flag = false ;
break ;
}
}
// If current string can be typed
// using keys from rowNum only
if (flag)
{
// Print the string
System.out.print(word + " " );
}
}
}
} // Driver Code public static void main(String[] args)
{ List<String> words = Arrays.asList(
"Yeti" , "Had" , "GFG" , "comment" );
findWordsSameRow(words);
} } // This code is contributed by jithin |
# Python3 program to implement # the above approach # Function to print all strings that # can be typed using keys of a single # row in a QWERTY Keyboard def findWordsSameRow(arr):
# Stores row number of all possible
# character of the strings
mp = { 'q' : 1 , 'w' : 1 , 'e' : 1 , 'r' : 1 ,
't' : 1 , 'y' : 1 , 'u' : 1 , 'o' : 1 ,
'p' : 1 , 'i' : 1 , 'a' : 2 , 's' : 2 ,
'd' : 2 , 'f' : 2 , 'g' : 2 , 'h' : 2 ,
'j' : 2 , 'k' : 2 , 'l' : 2 , 'z' : 3 ,
'x' : 3 , 'c' : 3 , 'v' : 3 , 'b' : 3 ,
'n' : 3 , 'm' : 3 }
# Traverse the array
for word in arr:
# If current string is
# not an empty string
if ( len (word) ! = 0 ):
# Sets true / false if a string
# can be typed using keys of a
# single row or not
flag = True
rowNum = mp[word[ 0 ].lower()]
# Stores length of word
M = len (word)
# Traverse current string
for i in range ( 1 , M):
# If current character can't be
# typed using keys of rowNum only
if (mp[word[i].lower()] ! = rowNum):
# Update flag
flag = False
break
# If current string can be typed
# using keys from rowNum only
if (flag):
# Print the string
print (word, end = ' ' )
# Driver Code words = [ "Yeti" , "Had" , "GFG" , "comment" ]
findWordsSameRow(words) # This code is contributed by avanitrachhadiya2155 |
// C# program to implement // the above approach using System;
using System.Collections.Generic;
class GFG
{ // Function to print all strings that // can be typed using keys of a single // row in a QWERTY Keyboard static void findWordsSameRow(List< string > arr)
{ // Stores row number of all possible
// character of the strings
Dictionary< char ,
int > mp = new Dictionary< char ,
int >();
mp.Add( 'q' , 1);
mp.Add( 'w' , 1);
mp.Add( 'e' , 1);
mp.Add( 'r' , 1);
mp.Add( 't' , 1);
mp.Add( 'y' , 1);
mp.Add( 'u' , 1);
mp.Add( 'i' , 1);
mp.Add( 'o' , 1);
mp.Add( 'p' , 1);
mp.Add( 'a' , 2);
mp.Add( 's' , 2);
mp.Add( 'd' , 2);
mp.Add( 'f' , 2);
mp.Add( 'g' , 2);
mp.Add( 'h' , 2);
mp.Add( 'j' , 2);
mp.Add( 'k' , 2);
mp.Add( 'l' , 2);
mp.Add( 'z' , 3);
mp.Add( 'x' , 3);
mp.Add( 'c' , 3);
mp.Add( 'v' , 3);
mp.Add( 'b' , 3);
mp.Add( 'n' , 3);
mp.Add( 'm' , 3);
// Traverse the array
foreach ( string word in arr)
{
// If current string is
// not an empty string
if (word.Length != 0)
{
// Sets true / false if a string
// can be typed using keys of a
// single row or not
bool flag = true ;
// Stores row number of the first
// character of current string
int rowNum = mp[ char .ToLower(word[0])];
// Stores length of word
int M = word.Length;
// Traverse current string
for ( int i = 1; i < M; i++)
{
// If current character can't be
// typed using keys of rowNum only
if (mp[Char.ToLower(word[i])] != rowNum)
{
// Update flag
flag = false ;
break ;
}
}
// If current string can be typed
// using keys from rowNum only
if (flag)
{
// Print the string
Console.Write(word + " " );
}
}
}
} // Driver Code public static void Main(String[] args)
{ List< string > words = new List< string >( new string [] {
"Yeti" , "Had" , "GFG" , "comment" });
findWordsSameRow(words);
} } // This code is contributed by chitranayal |
<script> // JavaScript program to implement
// the above approach
// Function to print all strings that
// can be typed using keys of a single
// row in a QWERTY Keyboard
function findWordsSameRow(arr) {
// Stores row number of all possible
// character of the strings
var mp = {};
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;
// Traverse the array
for (const word of arr) {
// If current string is
// not an empty string
if (word.length !== 0) {
// Sets true / false if a string
// can be typed using keys of a
// single row or not
var flag = true ;
// Stores row number of the first
// character of current string
var rowNum = mp[word[0].toLowerCase()];
// Stores length of word
var M = word.length;
// Traverse current string
for ( var i = 1; i < M; i++) {
// If current character can't be
// typed using keys of rowNum only
if (mp[word[i].toLowerCase()] !== rowNum) {
// Update flag
flag = false ;
break ;
}
}
// If current string can be typed
// using keys from rowNum only
if (flag) {
// Print the string
document.write(word + " " );
}
}
}
}
// Driver Code
var words = [ "Yeti" , "Had" , "GFG" , "comment" ];
findWordsSameRow(words);
</script> |
Yeti Had GFG
Time Complexity: O(N * M), where N and M denotes the number of strings and the length of the longest string respectively.
Auxiliary Space: O(1)