Home »
Interview coding problems/challenges
Special Keyboard
Special Keyboard: In this article we are going to see an interview problem that is special keyboard problem and its solution – which has been featured in Amazon interview rounds.
Submitted by Radib Kar, on June 09, 2020
Problem statement
Imagine you have a special keyboard with four types of keys:
Key 1: Prints 'I' on screen
Key 2: Select whatever printed in screen
Key 3: Copy selection to buffer
Key 4: Append buffer on-screen after what has already been printed. If you can only press the keyboard for N times (with the above four keys), write a program to produce maximum numbers of I's possible to be printed on the screen.
Input
Input is N, number of times keys can be pressed in total.
Output
Print maximum number of I's possible to print
Constraints
1 ≤ N ≤ 75
Example
Input:
2
Output:
2
Explanation:
We can at most get 2 I's on screen by pressing
following key sequence Key1, key1.
Pressing other keys have no effect.
Like key 1, key2 will produce only one I on screen.
Input:
7
Output:
9
Explanation:
We can at most get 9 I's on screen by pressing
following key sequence.
Key1, Key1, Key1, Key2, Key3, key4, Key4
I //after pressing key1
I I //again pressing key 1
I I I //again pressing key1
I I I //pressing key2 selects three I's
I I I // pressing key3 copies these three I's to buffer
I I I I I I // pressing key4 appends these three I's
I I I I I I I I I // pressing key4 again appends these three I's
Solution Approach
Basically,
Two things need to be understood to solve this problem
Key4 appends whatever is printed already on screen before 3 key pressing
That means at moment 4,
You can append whatever was printed while moment 1 as to print in moment 4, you need to press key2 at moment 2 and key3 at moment 3.
So, the recursive function can be written as
Let,
F(n) = max number of I’s printed on screen
So, for n>3
F(n) = max(f(j)*(n-j-1)) for 1<=j<=n-3
Where,
F(j) = already printed characters up to moment j
and (n-j-1) is number of appending possible
So, now we need to convert the recursion into DP.
1) Initialize dp[n+1] like following base value;
2) for i=0 to n
dp[i]=i;
3) Fill the DP table
for i=4 to n
for j=i-3 to 1,j--
dp[i]=max(dp[i],dp[j]*(i-j-1));
end for
End for
4) Return dp[n]
C++ Implementation
#include <bits/stdc++.h>
using namespace std;
int specialKeyboard(int n)
{
int dp[n + 1];
for (int i = 0; i <= n; i++)
dp[i] = i;
for (int i = 6; i <= n; i++) {
for (int j = i - 3; j >= 1; j--) {
dp[i] = std::max(dp[i], dp[j] * (i - j - 1));
}
}
return dp[n];
}
int main()
{
int t, n, item;
cout << "Input n, number of times keys to be pressed: ";
scanf("%d", &n);
cout << "max no of i's got printed: " << specialKeyboard(n) << endl;
return 0;
}
Output
Input n, number of times keys to be pressed: 7
max no of i's got printed: 9