题目
给出两个字符串和一个字典,判断两个字符串通过这个字典,需要多少步骤.
代码1
public int ladderLength(String beginWord, String endWord,
Set<String> wordDict) {
int[] ans =new int[1];
ans[0]=Integer.MAX_VALUE;
int temp =1;
Object[] strArray =wordDict.toArray();
boolean[] used = new boolean[strArray.length];
useme(beginWord,endWord,strArray,used,ans,temp);
return ans[0] == Integer.MAX_VALUE?0:ans[0];
}
private void useme(String beginWord, String endWord, Object[] strArray,
boolean[] used, int[] ans, int temp) {
if(oneStep(beginWord,endWord)){
ans[0]=Math.min(temp+1,ans[0]);
return;
}
if(temp>beginWord.length()+2){
return;
}
for(int i =0;i<strArray.length;i++){
String cur = (String)strArray[i];
if(!used[i] && oneStep(beginWord,cur)){
used[i]=true;
useme(cur,endWord,strArray,used,ans,temp+1);
used[i]=false;
}
}
}
private boolean oneStep(String beginWord, String cur) {
if(beginWord.length()!=cur.length()){
return false;
}
int count = 0;
for(int i=0;i<beginWord.length();i++){
if(beginWord.charAt(i)!=cur.charAt(i)){
count++;
}
}
return count==1?true:false;
}
代码2
public class Solution {
public int ladderLength(String beginWord, String endWord,
Set<String> wordDict) {
LinkedList<String> queue = new LinkedList<String>();
HashMap<String,Integer> record = new HashMap<String,Integer>();
queue.add(beginWord);
record.put(beginWord, 1);
if(oneStep(beginWord, endWord)){
return 2;
}
while(!queue.isEmpty()){
String cur = queue.poll();
int count = record.get(cur);
for(int i=0;i<cur.length();i++){
for(char change ='a';change<='z';change++){
if(cur.charAt(i)==change){
continue;
}
StringBuffer sb = new StringBuffer(cur);
sb.setCharAt(i, change);
String changedCur = sb.toString();
if(changedCur.equals(endWord)){
return count+1;
}
if(wordDict.contains(changedCur)&& !record.containsKey(changedCur)){
queue.add(changedCur);
record.put(changedCur, count+1);
}
}
}
}
return 0;
}
private boolean oneStep(String beginWord, String cur) {
if(beginWord.length()!=cur.length()){
return false;
}
int count = 0;
for(int i=0;i<beginWord.length();i++){
if(beginWord.charAt(i)!=cur.charAt(i)){
count++;
}
}
return count==1?true:false;
}
}
思考
1 典型的bfs。路径是字符串之间一个字符的改变,同时新字符串在字典中。
2 一种方式是每次都到字典里的所有字符串寻找,如代码1. 一种方式每次更改原字符串的一个字符,看是否在字典中,如代码2
3 算法分析一下。如果字典有n个string,每个string大小 l 长度 ,平均每个string关联k个另外的string。那么方法一需要O(k*k*n)的复杂度。方法二需要O(k*l*26)。根据k*n和I*26 来选择对应方法。
4 leetcode 的案列 应用的是 n大 l小的案列,所以用后者。