您的位置:首页 > 其它

[LeetCode127]Word Ladder

2014-06-25 01:11 483 查看
Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:

Only one letter can be changed at a time
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.

Analysis:

queue记录转变过程,对于每个存在于dict中的字符,进行替换。详细见code

Java

public class Solution {
    public int ladderLength(String start, String end, Set<String> dict) {
        if(start.length()!=end.length()) return 0;
        if(start.isEmpty() || end.isEmpty()) return 0;
        Queue<String> path = new LinkedList<>();
        path.add(start);
        int level = 1;
        int count = 1;
        dict.remove(start);
        while(dict.size()>0 &&!path.isEmpty()){
        	String curword = path.peek();
        	path.poll();
        	count--;
        	for(int i=0;i<curword.length();i++){
        		StringBuffer tmp = new StringBuffer(curword);
        		for(char j='a';j<='z';j++){
        			if(tmp.charAt(i)==j) continue;
        			tmp.replace(i, i+1, ""+j);
        			if(tmp.toString().equals(end)) return level+1;
        			if(dict.contains(tmp.toString())) path.add(tmp.toString());
        			dict.remove(tmp.toString());
        		}
        	}
        	if(count==0){
        		count = path.size();
        		level++;
        	}
        }
        return 0;
    }
}
c++

int ladderLength(string start, string end, unordered_set<string> &dict) {
        if(start.size() != end.size()) return 0;
    if(start.empty() || end.empty()) return 0;

    queue<string> path;
    path.push(start);
    int level = 1;
    int count = 1;
    dict.erase(start);
    while(dict.size()>0 && !path.empty()){
        string curword = path.front();
        path.pop();
        count --;
        for(int i=0; i<curword.size();i++){
            string tmp = curword;
            for(char j='a';j<='z';j++){
                if(tmp[i]==j) continue;
                tmp[i] =j;
                if(tmp == end) return level+1;
                if(dict.find(tmp)!=dict.end()) path.push(tmp);
                dict.erase(tmp);
            }
        }
        if(count ==0){
            count = path.size();
            level++;
        }
    }
    return 0;
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: