Published on

ARTS 第29周

Authors

Algorithm: 804. Unique Morse Code Words

Algorithm

package org.nocoder.leetcode.solution;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 804. 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.
 * <p>
 * For convenience, the full table for the 26 letters of the English alphabet is given below:
 * <p>
 * [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
 * Now, given a list of words, each word can be written as a concatenation of the Morse code of each letter. For example, "cba" can be written as "-.-..--...", (which is the concatenation "-.-." + "-..." + ".-"). We'll call such a concatenation, the transformation of a word.
 * <p>
 * Return the number of different transformations among all words we have.
 * <p>
 * Example:
 * Input: words = ["gin", "zen", "gig", "msg"]
 * Output: 2
 * Explanation:
 * The transformation of each word is:
 * "gin" -> "--...-."
 * "zen" -> "--...-."
 * "gig" -> "--...--."
 * "msg" -> "--...--."
 * <p>
 * There are 2 different transformations, "--...-." and "--...--.".
 * Note:
 * <p>
 * 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.
 *
 * @author jason
 * @date 2019/1/21.
 */
public class UniqueMorseCodeWords {
    private Map<String, String> initData() {
        String[] morseCodes = new String[]{
                ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
                "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-",
                ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."
        };

        HashMap<String, String> map = new HashMap<>(26);
        // ASCII a
        int letter = 97;
        for (int i = 0; i < morseCodes.length; i++) {
            map.put(String.valueOf((char) letter++), morseCodes[i]);
        }
        return map;
    }


    public int uniqueMorseRepresentations(String[] words) {
        final int MAX_LENGTH = 100;
        if (words == null || words.length == 0 || words.length > MAX_LENGTH) {
            return 0;
        }
        Map<String, String> map = initData();
        Set<String> resultSet = new HashSet<>();
        for (int i = 0; i < words.length; i++) {
            String word = words[i];
            StringBuilder morseCodes = new StringBuilder();
            for (int j = 0; j < word.length(); j++) {
                morseCodes.append(map.get(String.valueOf(word.charAt(j))));
            }
            resultSet.add(morseCodes.toString());
        }
        return resultSet.size();
    }

    public static void main(String[] args) {
        UniqueMorseCodeWords uniqueMorseCodeWords = new UniqueMorseCodeWords();
        uniqueMorseCodeWords.initData();
        String[] words = new String[]{"gin", "zen", "gig", "msg"};
        uniqueMorseCodeWords.uniqueMorseRepresentations(words);
    }
}