当前位置:  首页>> 技术小册>> 数据结构与算法(中)

难度:
Hard

题意:

  1. 给定最多100个长度为6的字符串
  2. 有一个字符串为秘密字符串,需要从这些字符串中猜出秘密字符串是哪个
  3. 每一轮猜会给出你猜的跟秘密字符串的不同字符数
  4. 最多猜10轮

思路:

  • 这个题就纯模拟,挑一个字符串,然后根据返回的数,来决定下一轮的备选字符串
  • 加快速度的话,可以枚举所有的字符串,判断这个字符串跟其他字符串的字符差的统计值,取统计值差异最大的字符串来作为这一轮的猜测
  • 类似决策树

代码:

  1. class Solution {
  2. private int calDiff(String word1, String word2) {
  3. int ret = 0;
  4. for (int i = 0;i < word1.length();i++) {
  5. if (word1.charAt(i) == word2.charAt(i)) {
  6. ret++;
  7. }
  8. }
  9. return ret;
  10. }
  11. private int select(int idx, List<Integer> pre, int[][] cache) {
  12. int[] dist = new int[7];
  13. Arrays.fill(dist, 0);
  14. for (int x: pre) {
  15. dist[cache[idx][x]] ++;
  16. }
  17. int ret = 0;
  18. for (int i = 0;i < 6;i++) {
  19. ret = Math.max(ret, dist[i]);
  20. }
  21. return ret;
  22. }
  23. private int select(List<Integer> pre, int[][] cache) {
  24. int value = 1000000;
  25. int ret = -1;
  26. for (int idx: pre) {
  27. int tmp = select(idx, pre, cache);
  28. if (tmp < value) {
  29. value = tmp;
  30. ret = idx;
  31. }
  32. }
  33. return ret;
  34. }
  35. public void findSecretWord(String[] wordlist, Master master) {
  36. int[][] cache = new int[wordlist.length][wordlist.length];
  37. for (int i = 0;i < wordlist.length;i++) {
  38. for (int j = 0;j < wordlist.length;j++) {
  39. cache[i][j] = calDiff(wordlist[i], wordlist[j]);
  40. }
  41. }
  42. List<Integer> pre = new ArrayList<Integer>();
  43. for (int i = 0;i < wordlist.length;i++) {
  44. pre.add(i);
  45. }
  46. while (pre.size() != 0) {
  47. int first = select(pre, cache);
  48. int diff = master.guess(wordlist[first]);
  49. if (diff == 6) {
  50. return;
  51. }
  52. List<Integer> post = new ArrayList<Integer>();
  53. for (int x: pre) {
  54. if (cache[first][x] == diff) {
  55. post.add(x);
  56. }
  57. }
  58. pre = post;
  59. }
  60. }
  61. }

该分类下的相关小册推荐: