minimum-genetic-mutation
2024-09-14 08:10:35
题目还是很好的,提供了一种新的思路方向。
细节方面,开始我的判断条件用的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("################"); }
}
最新文章
- 我为NET狂-----大前端专帖
- try-catch-finally 引发的奇怪问题
- c#简要概括面向对象的三大特征
- openssl evp 哈希算法(md5,sha1,sha256)
- Hadoop HDFS编程 API入门系列之简单综合版本1(四)
- Nginx 学习
- Spring的bean标签
- SharePoint API测试系列——对Recorded Item做OM操作(委托的妙用)
- Educational Codeforces Round 16 B
- 十六、Android 滑动效果汇总
- js 联系电话验证实现
- JAVA程序员成长历程(二)
- React Native 断点调试 跨域资源加载出错问题的原因分析
- centos7安装laravel
- hdu 2095 find your present (2) 位运算
- CentOS中利用Docker安装Redis
- Delphi XE5 Android 运行黑屏卡死的解决方法
- 文件查找:locate、find
- (转) [Flash/Flex] 用柏林噪音和滤镜制作翻腾的火焰效果----Flash AS3效应
- java程序设计基础篇 复习笔记 第六单元
热门文章
- 说说Thread.Sleep(0)的那些奇怪的事
- 7 天玩转 ASP.NET MVC — 第 5 天
- 国内Jquery CDN
- CF444C DZY Loves Colors
- POJ 2689 Prime Distance (素数筛选法,大区间筛选)
- input:text 的value 和 attribute(&#39;value&#39;) 不是一回事
- Codeigniter 利用加密Key(密钥)的对象注入漏洞
- (转)STL中set的用法
- (0)图像处理opengl 写在前面的话
- Integral类型的跨平台使用