日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lintcode 单词接龙II

發(fā)布時(shí)間:2025/3/8 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lintcode 单词接龙II 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題意

  給出兩個(gè)單詞(start和end)和一個(gè)字典,找出所有從start到end的最短轉(zhuǎn)換序列

  比如:

    1、每次只能改變一個(gè)字母。

    2、變換過程中的中間單詞必須在字典中出現(xiàn)。

注意事項(xiàng)

  • 所有單詞具有相同的長度。
  • 所有單詞都只包含小寫字母。

樣例

  給出數(shù)據(jù)如下:

  start =?"hit"

  end =?"cog"

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

  返回

  [

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

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

?   ]

?

解題思路

  根據(jù)每兩個(gè)單詞是否只差一個(gè)字母,進(jìn)行建圖,然后如下。

  1.深搜 + 回溯 + 記憶化(記錄每個(gè)節(jié)點(diǎn)到 終結(jié)點(diǎn) 的最短轉(zhuǎn)換序列),超時(shí)啦。。。

  2.通過廣搜 計(jì)算出終結(jié)點(diǎn)到各個(gè)節(jié)點(diǎn)的最短距離(包括源節(jié)點(diǎn)到終結(jié)點(diǎn)的最短距離,也就是和 最短轉(zhuǎn)換序列的長度對應(yīng))

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);//超時(shí)了,不知道怎么優(yōu)化 List<List<String>> result = new ArrayList<>();dist = new HashMap<>();dfs(result, new LinkedList<String>(), g, start, end, bfs(g, end, start));return result;}//通過bfs計(jì)算 終結(jié)點(diǎn) 到 源結(jié)點(diǎn) 的最短轉(zhuǎn)換長度,以及 終結(jié)點(diǎn)到各個(gè)結(jié)點(diǎn)的最短距離(在通過 dfs尋找 最短轉(zhuǎn)換序列的時(shí)候用到)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;}//記憶化搜索 每個(gè)節(jié)點(diǎn)到終點(diǎn)的最小步數(shù)的路徑private Map<String, List<List<String>>> resultMap;//每個(gè)節(jié)點(diǎn)的訪問的情況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;} }

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/hujunzheng/p/7327101.html

總結(jié)

以上是生活随笔為你收集整理的lintcode 单词接龙II的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人手机视频在线观看 | 手机av在线免费观看 | 伊人av一区 | 高清国产mv在线观看 | 伊人98| 日本天堂在线播放 | 男人的天堂av网站 | 国产绳艺sm调教室论坛 | 一区二区三区亚洲视频 | 爱爱三级视频 | 国产精品午夜未成人免费观看 | 五色天婷婷 | 中文字幕+乱码+中文乱码91 | 男女交性视频播放 | 毛片成人网 | zoo性欧美 | 伦理片久久 | 人人操在线播放 | 美女野外找人搭讪啪啪 | 伊人久久婷婷 | 久久精品视频在线免费观看 | 奇米在线播放 | 理论黄色片| 日韩精品在线观看一区 | 婚后打屁股高h1v1调教 | 亚洲国产成人91精品 | 久操综合 | 大乳女喂男人吃奶视频 | 在线观看免费观看在线 | 在哪里可以看毛片 | 亚洲最大看欧美片网站 | 欧美一级高清片 | 动漫毛片 | 超碰在线成人 | 一级黄色录像免费观看 | 国产精品久久久久9999 | 国产视频分类 | 九色视频91| 97在线播放| 成人午夜久久 | 俄罗斯黄色大片 | 天堂аⅴ在线最新版在线 | 中文字幕有码在线 | 日韩在线1| 久久成年人 | 亚洲成人一二三 | 琪琪色在线视频 | 免费看日韩av | 一区二区三区美女视频 | 91视频日本 | 欧美激情一级精品国产 | 久草色在线 | 欧美激情一级 | 麻豆美女视频 | 日韩成人在线影院 | 草草国产| 亚洲精品一区 | 99精品久久毛片a片 成人网一区 | 欧美日韩看片 | 一级黄网 | 视频在线观看视频 | 亚州成人| 日本高清免费观看 | 亚洲天天视频 | 免费的黄色小视频 | 国产精品无码人妻一区二区在线 | 天天做天天爱天天操 | 成人在线观看h | 素人av在线 | 麻豆91茄子在线观看 | 男男受被啪到高潮自述 | 欧美激情天堂 | 91精品国自产 | 女生的胸无遮挡 | 亚洲天堂一区在线观看 | 亚洲一区二区三区久久久 | 欧美精品色呦呦 | 精品少妇无码av无码专区 | 国产三级三级三级 | 日日草草 | 少妇荡乳情欲办公室456视频 | 亚洲春色在线观看 | 用我的手指扰乱你 | 夜色综合| 神马久久久久久久久久久 | 老司机深夜免费福利 | 啪啪免费视频网站 | 男女插鸡视频 | 中文字幕乱码一区二区三区 | 丁香六月欧美 | www夜插内射视频网站 | 美女洗澡无遮挡 | 国产福利小视频在线观看 | 天天久久综合网 | 国产欧美精品一区二区三区app | 久操福利视频 | 自拍在线视频 | 95视频在线观看 | 大片av|