国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: "a" 对应 ".-", "b" 对应 "-...", "c" 对应 "-.-.", 等等。 为了方便,所有26个英文字母对应摩尔斯密码表如下: [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."] 给定一个单词列表,每个单词可以写成每个字母对应摩尔斯密码的组合。例如,"cab" 可以写成 "-.-..--...",(即 "-.-." + "-..." + ".-"字符串的结合)。我们将这样一个连接过程称作单词翻译。 返回我们可以获得所有词不同单词翻译的数量。 例如: 输入: words = ["gin", "zen", "gig", "msg"] 输出: 2 解释: 各单词翻译如下: "gin" -> "--...-." "zen" -> "--...-." "gig" -> "--...--." "msg" -> "--...--." 共有 2 种不同翻译, "--...-." 和 "--...--.". 注意: 单词列表words 的长度不会超过 100。 每个单词 words[i]的长度范围为 [1, 12]。 每个单词 words[i]只包含小写字母。
1 int uniqueMorseRepresentations(char ** words, int wordsSize){ 2 char mors[][5] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."}; 3 char result[wordsSize+1][50]; 4 int i = 0; 5 int j = 0; 6 int sum = wordsSize; 7 8 for(i=0; i<wordsSize; i++) 9 { 10 result[i][0] = '\0'; 11 for(j=0; j<strlen(words[i]); j++) 12 { 13 strcat(result[i], mors[words[i][j] - 97]); 14 } 15 } 16 17 18 for(i=0; i<wordsSize; i++) 19 { 20 for(j=i+1; j<wordsSize; j++) 21 { 22 if(strcmp(result[i], result[j]) == 0) 23 { 24 sum--; 25 break; 26 } 27 } 28 } 29 30 return sum; 31 32 }
解题思路:
通过查表与拼接完成字符间的替换,
首先直接把所有的单词完成替换(预处理),
然后通过选择排序的方式完成重复字符串的查找,并在总数中-1,
最后即为不同单词翻译的数量。