Unique Morse Code Words
International Morse Code defines a standard encoding where each letter is mapped to a series of dots and dashes, as follows: "a" maps to
".-"
, "b" maps to"-..."
, "c" maps to"-.-."
, and so on.For convenience, the full table for the 26 letters of the English alphabet is given below:
[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
Now, given a list of words, each word can be written as a concatenation of the Morse code of each letter. For example, "cab" can be written as "-.-.-....-", (which is the concatenation "-.-." + "-..." + ".-"). We'll call such a concatenation, the transformation of a word.
Return the number of different transformations among all words we have.
Example:
Input: words = ["gin", "zen", "gig", "msg"]
Output: 2
Explanation:
The transformation of each word is:
- "gin" →
"--...-."
- "zen" →
"--...-."
- "gig" →
"--...--."
- "msg" →
"--...--."
There are 2 different transformations,
"--...-."
and"--...--."
.Note:
- The length of words will be at most 100.
- Each words[i] will have length in range [1, 12].
- words[i] will only consist of lowercase letters.
My approach:
import java.util.*;
class Solution {
public int uniqueMorseRepresentations(String[] words) {
HashMap<String,String> morseMap = new HashMap<>(26);
String [] morseWords = new String[] {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
HashSet<String> uniqCode = new HashSet<>();
String morse = "";
int ind;
for( int i = 0; i < words.length; i++ )
{
morse = "";
for( int j = 0; j < words[i].length(); j++ )
{
ind = ((int)words[i].charAt(j)) - 97;
morse += morseWords[ind];
}
uniqCode.add(morse);
}
return uniqCode.size();
}
}
A 2nd approach using Java Stream:
public int uniqueMorseRepresentations(String[] words) {
Set<String> res = Arrays.stream(words).map(i -> getMC(i)).collect(Collectors.toSet());
return res.size();
}
private String getMC(String str) {
String[] mCode = {".-","-...","-.-.","-..",".","..-.","--.","....","..",
".---","-.-",".-..","--","-.","---",".--.","--.-",".-.",
"...","-","..-","...-",".--","-..-","-.--","--.."};
return str.chars().mapToObj(ch -> mCode[(char)ch % 97]).reduce("", String::concat);
}
With regards to the above code snippets, I have the following questions:
Which approach is better according to an interviewer?
What can be improved in the 1st approach?
Does the 2nd approach sacrifice readability for succintness?
Is there a better method, eg StringBuilder in place of string that can speed up the solution of the first approach?