Word Ladder

来源:互联网 发布:php 文件上传 测试 编辑:程序博客网 时间:2024/06/04 19:51

Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the dictionary

For example,

Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length 5.

Note:

  • Return 0 if there is no such transformation sequence.
  • All words have the same length.
  • All words contain only lowercase alphabetic characters.

要求在给定字典dict中寻找可以变幻的词(只有一位不同)确认是否能够转换至 end  一开始想的是用回溯递归进行遍历求解 但是 由太多的重复情况 而且对于dict的管理也比较麻烦  后来变换思维 不从dict中找词匹配 而是建一个栈 先把需要比较的词 按位 从a-z分别替换  再到dict中查找 若该词存在则加入栈 直至栈空  ps;在替换第j位的字母时 使用 String ntmp=com.substring(0, j)+m+com.substring(j+1,com.length());时 总是说 memory limit exceeded 不知道为什么 改为字符数组后就解决了这问题  代码如下:

public static int ladderLength1(String start, String end, Set<String> dict) {        LinkedList<String> que=new LinkedList<>();        dict.remove(start);        que.offer(start);        int count =0;        int level =1;        int res=1;        while(!que.isEmpty()){        count=level;        level=0;        for(int i=0;i<count;i++){        String com=que.poll();        for(int j=0;j<com.length();j++){        for(char m='a';m<='z';m++){        if(com.charAt(j)==m)continue;        String ntmp=com.substring(0, j)+m+com.substring(j+1,com.length());        if(ntmp.equals(end))return res+1;        if(dict.contains(ntmp)){        level++;               dict.remove(ntmp);        que.add(ntmp);        }        }        }        }        res++;        }return 0;    }


 

0 0
原创粉丝点击