lintcode 单词接龙II

题意

  给出两个单词(start和end)和一个字典,找出所有从start到end的最短转换序列

  比如:

    1、每次只能改变一个字母。

    2、变换过程中的中间单词必须在字典中出现。

注意事项

  • 所有单词具有相同的长度。
  • 所有单词都只包含小写字母。

样例

  给出数据如下:

  start = "hit"

  end = "cog"

  dict = ["hot","dot","dog","lot","log"]

  返回

  [

      ["hit","hot","dot","dog","cog"],

      ["hit","hot","lot","log","cog"]

    ]

 

解题思路

  根据每两个单词是否只差一个字母,进行建图,然后如下。

  1.深搜 + 回溯 + 记忆化(记录每个节点到 终结点 的最短转换序列),超时啦。。。

  2.通过广搜 计算出终结点到各个节点的最短距离(包括源节点到终结点的最短距离,也就是和 最短转换序列的长度对应)

public class Solution {/*** @param start, a string* @param end,   a string* @param dict,  a set of string* @return a list of lists of string*/public List<List<String>> findLadders(String start, String end, Set<String> dict) {// write your code hereMap<String, List<String>> g = new HashMap<>();Set<String> words = new HashSet<>(dict);words.add(start);words.add(end);String[] wordArray = words.toArray(new String[0]);for (int i = 0; i < wordArray.length - 1; ++i) {for (int j = i + 1; j < wordArray.length; ++j) {String first = wordArray[i], second = wordArray[j];if (this.wordDiffCnt(first, second) == 1) {if (!g.containsKey(first)) {List<String> newList = new ArrayList<>();g.put(first, newList);}g.get(first).add(second);if (!g.containsKey(second)) {List<String> newList = new ArrayList<>();g.put(second, newList);}g.get(second).add(first);}}}resultMap = new HashMap<>();visit = new HashSet<>();//      return dfs(g, start, end);//超时了,不知道怎么优化
List<List<String>> result = new ArrayList<>();dist = new HashMap<>();dfs(result, new LinkedList<String>(), g, start, end, bfs(g, end, start));return result;}//通过bfs计算 终结点 到 源结点 的最短转换长度,以及 终结点到各个结点的最短距离(在通过 dfs寻找 最短转换序列的时候用到)private Map<String, Integer> dist;private int bfs(Map<String, List<String>> g, String start, String end) {Queue<String> queue = new LinkedList<>();visit.add(start);queue.add(start);dist.put(start, 1);int minLen = 0;while(!queue.isEmpty()) {start = queue.poll();if(start.equals(end)) {if(minLen == 0) {minLen = dist.get(start);}}if(g.containsKey(start)) {for (String next : g.get(start)) {if(visit.contains(next)) continue;visit.add(next);queue.add(next);dist.put(next, dist.get(start)+1);}}}visit.clear();return minLen;}private void dfs(List<List<String>> result, List<String> tmp, Map<String, List<String>> g, String start, String end, int minLen) {if(tmp.size()+dist.get(start)-1 >= minLen) return;if (start.equals(end)) {result.add(new ArrayList<>(tmp));result.get(result.size() - 1).add(end);return;}visit.add(start);tmp.add(start);if (g.containsKey(start)) {for (String next : g.get(start)) {if(visit.contains(next)) continue;dfs(result, tmp, g, next, end, minLen);}}visit.remove(start);tmp.remove(tmp.size()-1);}@Deprecatedprivate List<List<String>> dfs(Map<String, List<String>> g, String start, String end) {List<List<String>> result = new ArrayList<>();if (start.equals(end)) {List<String> list = new ArrayList<>();list.add(end);result.add(list);resultMap.put(end, result);return result;}if (resultMap.containsKey(start)) {return resultMap.get(start);}if (!g.containsKey(start)) {resultMap.put(start, null);return null;}visit.add(start);List<List<String>> nextResult = new ArrayList<>();int minLen = Integer.MAX_VALUE;for (String next : g.get(start)) {if(visit.contains(next)) continue;List<List<String>> tmp = dfs(g, next, end);if (tmp != null) {for (List<String> list : tmp) {if(minLen > list.size()) minLen = list.size();nextResult.add(list);}}}visit.remove(start);for (List<String> list : nextResult) {if (list.size() == minLen) {List<String> tmp = new LinkedList<>(list);tmp.add(0, start);result.add(tmp);}}if(result.size() > 0) {resultMap.put(start, result);}return result;}//记忆化搜索 每个节点到终点的最小步数的路径private Map<String, List<List<String>>> resultMap;//每个节点的访问的情况private Set<String> visit;private int wordDiffCnt(String s1, String s2) {int diffCnt = 0;for (int i = 0; i < s1.length(); ++i) {if (s1.charAt(i) != s2.charAt(i)) {++diffCnt;}}return diffCnt;}
}

 

 

 

转载于:https://www.cnblogs.com/hujunzheng/p/7327101.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lintcode 最大子数组III

题目描述 给定一个整数数组和一个整数 k&#xff0c;找出 k 个不重叠子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的。 返回最大的和。 注意事项 子数组最少包含一个数 样例 给出数组 [-1,4,-2,3,-2,3] 以及 k 2&#xff0c;返回 8 思路 dp[i][j] max(…

idea模板注释

类文件头部的注释 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java") /** * ${DESCRIPTION} * author ${USER} hujunzheng * create ${YEAR}-${MONTH}-${DAY} ${TIME} **/ public class ${N…

redis分布式锁小试

一、场景 项目A监听mq中的其他项目的部署消息&#xff08;包括push_seq, status, environment&#xff0c;timestamp等&#xff09;&#xff0c;然后将部署消息同步到数据库中&#xff08;项目X在对应环境[environment]上部署的push_seq[项目X的版本]&#xff09;。那么问题来了…

Jackson ObjectMapper readValue过程

1.整体调用栈 2.看一下调用栈的两个方法 resolve 方法中通过 Iterator i$ this._beanProperties.iterator() 遍历属性的所有子属性&#xff0c;缓存对应的 deserializer。观察调用栈的方法&#xff0c;可以发现是循环调用的。 3.比如寻找自定义的 LocalDateTime类的序列化实现…

java如何寻找main函数对应的类

参考springboot Class<?> deduceMainApplicationClass() {try {StackTraceElement[] stackTrace new RuntimeException().getStackTrace();for (StackTraceElement stackTraceElement : stackTrace) {if ("main".equals(stackTraceElement.getMethodName())…

jooq实践

用法 sql语句 SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)FROM AUTHORJOIN BOOK ON AUTHOR.ID BOOK.AUTHOR_IDWHERE BOOK.LANGUAGE DEAND BOOK.PUBLISHED > DATE 2008-01-01 GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAMEHAVING COUNT(*) > 5 ORDER BY AUT…

不同包下,相同数据结构的两个类进行转换

import com.alibaba.fastjson.JSON; JSON.parseObject(JSON.toJSONString(obj1), obj2.class) import com.fasterxml.jackson.databind.ObjectMapper; objectMapper.convertValue(obj1, obj2.class); 两个工具类 JsonUtil JacksonHelper 转载于:https://www.cnblogs.com/hujunz…

git根据用户过滤提交记录

使用SourceTree 使用gitk 转载于:https://www.cnblogs.com/hujunzheng/p/8398203.html

springboot Autowired BeanNotOfRequiredTypeException

现象 org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named xxxxImpl is expected to be of type com.xxx.xxxImpl but was actually of type com.sun.proxy.$Proxy62 直接Autowired一个实现类&#xff0c;而不是接口 Autowired private XxxServiceI…

cglib动态代理导致注解丢失问题及如何修改注解允许被继承

现象 SOAService这个bean先后经过两个BeanPostProcessor&#xff0c;会发现代理之后注解就丢失了。 开启了cglib代理 SpringBootApplication EnableAspectJAutoProxy(proxyTargetClass true) public class Application {public static void main(String[] args) {SpringApplic…

spring AbstractBeanDefinition创建bean类型是动态代理类的方式

1.接口 Class<?> resourceClass 2.获取builder BeanDefinitionBuilder builder BeanDefinitionBuilder.genericBeanDefinition(resourceClass); 3.获取接口对应的动态代理class Class<?> targetProxyClass Proxy.getProxyClass(XXX.class.getClassLoader(), ne…

TypeReference -- 让Jackson Json在List/Map中识别自己的Object

private Map<String, Object> buildHeaders(Object params) {ObjectMapper objectMapper JacksonHelper.getMapper();return objectMapper.convertValue(params, new TypeReference<Map<String, Object>>(){}); } 参考How to use Jackson to deserialis…

微信小程序:一起玩连线,一个算法来搞定

微信小程序&#xff1a;一起玩连线 游戏玩法 将相同颜色的结点连接在一起&#xff0c;连线之间不能交叉。 算法思想 转换为多个源点到达对应终点的路径问题&#xff0c;且路径之间不相交。按照dfs方式寻找两个结点路径&#xff0c;一条路径探索完之后&#xff0c;标记地图并记录…

IntelliJ IDEA关于logger的live template配置

1.安装 log support2插件 2.配置log support2 由于项目中的日志框架是公司自己封装的&#xff0c;所以还需要自己手动改一下 log support2插件生成的live template 当然也可以修改 Log support global的配置 包括 Logger Field、Logger class、Logger Factory class都可以修改。…

springboot项目接入配置中心,实现@ConfigurationProperties的bean属性刷新方案

前言 配置中心&#xff0c;通过keyvalue的形式存储环境变量。配置中心的属性做了修改&#xff0c;项目中可以通过配置中心的依赖&#xff08;sdk&#xff09;立即感知到。需要做的就是如何在属性发生变化时&#xff0c;改变带有ConfigurationProperties的bean的相关属性。 配置…

jackson实现java对象转支付宝/微信模板消息

一、支付宝消息模板大致长这样 {"to_user_id": "","telephone": "xxxxx","template": {"template_id": "xxxxxx","context": {"head_color": "#85be53","url"…

简单封装kafka相关的api

一、针对于kafka版本 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>0.8.2.2</version></dependency><dependency><groupId>org.apache.kafka</groupId>…

springmvc controller动态设置content-type

springmvc RequestMappingHandlerAdapter#invokeHandlerMethod 通过ServletInvocableHandlerMethod#invokeAndHandle调用目标方法&#xff0c;并处理返回值。 如果return value &#xff01; null&#xff0c;则通过returnvalueHandlers处理&#xff0c;内部会调用MessageConv…

springboot2.0 redis EnableCaching的配置和使用

一、前言 关于EnableCaching最简单使用&#xff0c;个人感觉只需提供一个CacheManager的一个实例就好了。springboot为我们提供了cache相关的自动配置。引入cache模块&#xff0c;如下。 二、maven依赖 <dependency><groupId>org.springframework.boot</groupId…

依赖配置中心实现注有@ConfigurationProperties的bean相关属性刷新

配置中心是什么 配置中心&#xff0c;通过keyvalue的形式存储环境变量。配置中心的属性做了修改&#xff0c;项目中可以通过配置中心的依赖&#xff08;sdk&#xff09;立即感知到。需要做的就是如何在属性发生变化时&#xff0c;改变带有ConfigurationProperties的bean的相关属…