解法一
建立两张映射表分别为表示word与pattern间字母的双射关系。
遍历单词的各个字母,如果符合映射表就继续,如果没有建立映射关系就根据当前值建立双射关系,如果不符合已有的双射关系说明该单词和模式串是不匹配的。
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
class Solution {
public List<String> findAndReplacePattern(String[] words, String pattern) {
List<String> ansList = new LinkedList<>();
// word->pattern
char[] tableX = new char[26];
// pattern->word
char[] tableY = new char[26];
int i;
char ch1, ch2;
for (String word : words) {
boolean flag = true;
for (i = 0; i < word.length(); ++i) {
ch1 = word.charAt(i);
ch2 = pattern.charAt(i);
if ((tableX[ch1 - 97] == ch2) && (tableY[ch2 - 97] == ch1)) {
continue;
}
if ((tableX[ch1 - 97] == '\0') && (tableY[ch2 - 97] == '\0')) {
tableX[ch1 - 97] = ch2;
tableY[ch2 - 97] = ch1;
continue;
}
if ((tableX[ch1 - 97] != ch2) || (tableY[ch2 - 97] != ch1)) {
flag = false;
break;
}
}
if (flag) {
ansList.add(word);
}
Arrays.fill(tableX, '\0');
Arrays.fill(tableY, '\0');
}
return ansList;
}
}