题目还是很好的,提供了一种新的思路方向。

细节方面,开始我的判断条件用的dict,不太好,后来debug好了。

另外,注意其中用数组初始化Set的方法:Set<String> dict = new HashSet(Arrays.asList(bank));

还有 Set<String> a = new Hash<>(); 当中前面<>里面加String的原因是提取出来的直接就是String,后面<>指的是接受各种类型。不加<>表示不区分类型,应该和<>是等价的效果。

https://leetcode.com/problems/minimum-genetic-mutation/

// 这个方法特别好
// https://discuss.leetcode.com/topic/63959/c-two-end-bfs-solution-exactly-same-as-127-word-ladder
// 提到与 https://leetcode.com/problems/word-ladder/ 127. Word Ladder 题目其实是一模一样的
// 看了一下,的确是的 public class Solution {
// 这个题目里面用到了两面BFS的方法,然后通过对字符串的替换,来降低优先级
// 之前另一个题目 Word Ladder里面,用的是一端到另一端的
// 现在这个更巧妙一些,因为从set里面找结果,比遍历set的内容要更高效一些
public int minMutation(String start, String end, String[] bank) {
Set<String> dict = new HashSet(Arrays.asList(bank));
if (!dict.contains(end)) {
return -1;
} Set<String> lessSet = new HashSet();
Set<String> moreSet = new HashSet(); char[] chList = {'A', 'C', 'G', 'T'}; lessSet.add(start);
moreSet.add(end);
int step = 0;
while (true) { // wrong: if dict is empty, no need to check more
// right: check lessSet
if (lessSet.isEmpty()) {
return -1;
} if (moreSet.size() < lessSet.size()) {
Set<String> tmp = lessSet;
lessSet = moreSet;
moreSet = tmp;
}
//printSet(lessSet, moreSet, dict); step++;
Iterator<String> iter = lessSet.iterator();
Set<String> newSet = new HashSet();
while(iter.hasNext()) {
String str = iter.next();
for (int i=0; i<str.length(); i++) {
StringBuilder sb =new StringBuilder(str);
for (int j=0; j<4; j++) {
if (str.charAt(i) == chList[j]) {
continue;
} sb.setCharAt(i, chList[j]);
if (moreSet.contains(sb.toString())) {
return step;
} if (dict.contains(sb.toString())) {
dict.remove(sb.toString());
newSet.add(sb.toString()); } }
}
}
lessSet = newSet;
}
} private void printSet(Set<String> lessSet, Set<String> moreSet, Set<String>dict) {
System.out.printf("Here is lessSet:");
Iterator<String> iter = lessSet.iterator();
while (iter.hasNext()) {
System.out.printf("%s,", iter.next());
}
System.out.println();
System.out.printf("Here is moreSet:");
iter = moreSet.iterator();
while (iter.hasNext()) {
System.out.printf("%s,", iter.next());
}
System.out.println();
System.out.printf("Here is dict:");
iter = dict.iterator();
while (iter.hasNext()) {
System.out.printf("%s,", iter.next());
}
System.out.println();
System.out.println("################"); }
}

最新文章

  1. 我为NET狂-----大前端专帖
  2. try-catch-finally 引发的奇怪问题
  3. c#简要概括面向对象的三大特征
  4. openssl evp 哈希算法(md5,sha1,sha256)
  5. Hadoop HDFS编程 API入门系列之简单综合版本1(四)
  6. Nginx 学习
  7. Spring的bean标签
  8. SharePoint API测试系列——对Recorded Item做OM操作(委托的妙用)
  9. Educational Codeforces Round 16 B
  10. 十六、Android 滑动效果汇总
  11. js 联系电话验证实现
  12. JAVA程序员成长历程(二)
  13. React Native 断点调试 跨域资源加载出错问题的原因分析
  14. centos7安装laravel
  15. hdu 2095 find your present (2) 位运算
  16. CentOS中利用Docker安装Redis
  17. Delphi XE5 Android 运行黑屏卡死的解决方法
  18. 文件查找:locate、find
  19. (转) [Flash/Flex] 用柏林噪音和滤镜制作翻腾的火焰效果----Flash AS3效应
  20. java程序设计基础篇 复习笔记 第六单元

热门文章

  1. 说说Thread.Sleep(0)的那些奇怪的事
  2. 7 天玩转 ASP.NET MVC — 第 5 天
  3. 国内Jquery CDN
  4. CF444C DZY Loves Colors
  5. POJ 2689 Prime Distance (素数筛选法,大区间筛选)
  6. input:text 的value 和 attribute(&#39;value&#39;) 不是一回事
  7. Codeigniter 利用加密Key(密钥)的对象注入漏洞
  8. (转)STL中set的用法
  9. (0)图像处理opengl 写在前面的话
  10. Integral类型的跨平台使用