一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 696|回复: 3
收起左侧

[算法题] Permutations 和 Word ladder 和 Word break

[复制链接] |试试Instant~ |关注本帖
love1point 发表于 2015-6-10 14:41:37 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
大家这三道题有什么好的解法吗。自己做了和看了网上的答案,感觉都不是很好地能记下来,很容易忘


Permutations:
  1. public class Solution {
  2.     public ArrayList<ArrayList<Integer>> permute(int[] nums) {
  3.         ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
  4.         
  5.         result.add(new ArrayList<Integer>());
  6.         
  7.         for(int i = 0; i < nums.length; i++)
  8.         {
  9.             ArrayList<ArrayList<Integer>> curr = new ArrayList<ArrayList<Integer>>();
  10.             for(ArrayList<Integer> l : result)
  11.             {
  12.                 for(int j = 0; j < l.size()+1; j++)
  13.                 {
  14.                     l.add(j, nums[i]);
  15.                     ArrayList<Integer> temp = new ArrayList<Integer>(l);
  16.                     curr.add(temp);
  17.                     l.remove(j);
  18.                 }
  19.             }
  20.             result = new ArrayList<ArrayList<Integer>>(curr);
  21.         }
  22.         return result;
  23.     }
  24. }
复制代码
Word ladder:
  1. public class Solution {
  2.     public int ladderLength(String beginWord, String endWord, Set<String> wordDict) {
  3.         if (wordDict.size() == 0)
  4.                 return 0;

  5.         wordDict.add(endWord);

  6.         LinkedList<String> wordQueue = new LinkedList<String>();
  7.         LinkedList<Integer> distanceQueue = new LinkedList<Integer>();

  8.         wordQueue.add(beginWord);
  9.         distanceQueue.add(1);

  10.         //track the shortest path
  11.         int result = Integer.MAX_VALUE;
  12.         while (!wordQueue.isEmpty()) {
  13.                 String currWord = wordQueue.pop();
  14.                 Integer currDistance = distanceQueue.pop();

  15.                 if (currWord.equals(endWord)) {
  16.                         result = Math.min(result, currDistance);
  17.                 }

  18.                 for (int i = 0; i < currWord.length(); i++) {
  19.                         char[] currCharArr = currWord.toCharArray();
  20.                         for (char c = 'a'; c <= 'z'; c++) {
  21.                                 currCharArr[i] = c;

  22.                                 String newWord = new String(currCharArr);
  23.                                 if (wordDict.contains(newWord)) {
  24.                                         wordQueue.add(newWord);
  25.                                         distanceQueue.add(currDistance + 1);
  26.                                         wordDict.remove(newWord);
  27.                                 }
  28.                         }
  29.                 }
  30.         }

  31.         if (result < Integer.MAX_VALUE)
  32.                 return result;
  33.         else
  34.                 return 0;
  35.     }
  36.    
  37.    
  38. }

复制代码
Word break:
  1. public class Solution {
  2.     public boolean wordBreak(String s, Set<String> wordDict) {
  3.         boolean[] t = new boolean[s.length()+1];
  4.         t[0] = true;
  5.         
  6.         for(int i = 0; i<s.length(); i++)
  7.         {
  8.             if(!t[i])
  9.             {
  10.                 continue;
  11.             }
  12.             for(String a : wordDict)
  13.             {
  14.                 int len = a.length();
  15.                 int end = i + len;
  16.                
  17.                 if(end > s.length())
  18.                 {
  19.                     continue;
  20.                 }
  21.                
  22.                 if(t[end])
  23.                 {
  24.                    continue;
  25.                 }
  26.                
  27.                 if(s.substring(i,end).equals(a))
  28.                 {
  29.                     t[end]=true;
  30.                 }
  31.             }
  32.         }
  33.         return t[s.length()];
  34.     }
  35. }
复制代码
e5399014 发表于 2015-6-12 14:27:06 | 显示全部楼层
word ladder --》 BFS
word break --》 DP
permutation --》 DFS
回复 支持 反对

使用道具 举报

 楼主| love1point 发表于 2015-6-27 21:59:22 | 显示全部楼层
e5399014 发表于 2015-6-12 14:27
word ladder --》 BFS
word break --》 DP
permutation --》 DFS

感谢讨论哈。

目前我只剩下word ladder需要再看一下,另外两个掌握了
回复 支持 反对

使用道具 举报

zhuli19901106 发表于 2015-6-27 22:40:54 | 显示全部楼层
本帖最后由 zhuli19901106 于 2015-6-27 22:59 编辑

word ladder这题写起来挺麻烦,但是思路就是边长为1的无向图里,求单源最短路径,所以用BFS或者Dijkstra都可解决。
如果要更快的话,可以双向BFS。


你发的代码应该已经是单向BFS的最优解了吧?不过,又不是原创吧,搜到了N个一模一样的。。
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-9 06:00

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表