难度:
Hard
题意:
思路:
代码:
class Solution {
private int calDiff(String word1, String word2) {
int ret = 0;
for (int i = 0;i < word1.length();i++) {
if (word1.charAt(i) == word2.charAt(i)) {
ret++;
}
}
return ret;
}
private int select(int idx, List<Integer> pre, int[][] cache) {
int[] dist = new int[7];
Arrays.fill(dist, 0);
for (int x: pre) {
dist[cache[idx][x]] ++;
}
int ret = 0;
for (int i = 0;i < 6;i++) {
ret = Math.max(ret, dist[i]);
}
return ret;
}
private int select(List<Integer> pre, int[][] cache) {
int value = 1000000;
int ret = -1;
for (int idx: pre) {
int tmp = select(idx, pre, cache);
if (tmp < value) {
value = tmp;
ret = idx;
}
}
return ret;
}
public void findSecretWord(String[] wordlist, Master master) {
int[][] cache = new int[wordlist.length][wordlist.length];
for (int i = 0;i < wordlist.length;i++) {
for (int j = 0;j < wordlist.length;j++) {
cache[i][j] = calDiff(wordlist[i], wordlist[j]);
}
}
List<Integer> pre = new ArrayList<Integer>();
for (int i = 0;i < wordlist.length;i++) {
pre.add(i);
}
while (pre.size() != 0) {
int first = select(pre, cache);
int diff = master.guess(wordlist[first]);
if (diff == 6) {
return;
}
List<Integer> post = new ArrayList<Integer>();
for (int x: pre) {
if (cache[first][x] == diff) {
post.add(x);
}
}
pre = post;
}
}
}