DBFS[leetcode 127]
class Solution {
public:
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
return DBFS(beginWord, endWord, wordList);
// return ladderLength1(beginWord, endWord, wordList);
}
private:
int BFS(string beginWord, string endWord, vector<string>& wordList)
{
//step1 preprocess the wordlist;
//对wordList打个表;
unordered_multimap<string, string> dict;
//visited实际上是记录访问的;
unordered_set<string> visited;
bool isValid = false;
for (auto& word : wordList) {
if (word == endWord) isValid = true;
string str = word;
for (int i = 0; i < word.size(); i++) {
//string str = word;
str[i] = '*';
dict.emplace(str, word);
str[i] = word[i];
}
}
//如果转换表中没有到结果的转换,那么肯定就不行了;
if (!isValid) return 0;
//接下来就是BFS套路;
queue<string> qu;
qu.push(beginWord);
int step = 1;
while(!qu.empty()) {
step++;
int len = qu.size();
while (len--) {
string cur = qu.front();
qu.pop();
for (int i = 0; i < cur.size(); i++) {
char tmp = cur[i];
cur[i] = '*';
//在dict表中查找;
auto range = dict.equal_range(cur);
for (auto itr = range.first; itr != range.second; itr++) {
if (visited.count(itr->second) == 0) { //当关键字没有被访问时;
if (itr->second == endWord) return step;
qu.push(itr->second);
visited.emplace(itr->second);
}
}
cur[i] = tmp;
}
}
}
return 0;
}
int visitWordNode(unordered_multimap<string, string>& dict, queue<pair<string, int>>& qu, unordered_map<string, int>& start_visited,
unordered_map<string, int>& end_visited)
{
auto p1 = qu.front();
auto s1 = p1.first;
qu.pop();
for (int i = 0; i < s1.size(); i++) {
char tmp = s1[i];
s1[i] = '*';
auto range = dict.equal_range(s1);
for (auto it = range.first; it != range.second; it++) {
if (end_visited.find(it->second) != end_visited.end())
return p1.second + end_visited[it->second];
if (start_visited.find(it->second) == start_visited.end()) {
start_visited.emplace(it->second, p1.second +1 );
qu.push(make_pair(it->second, p1.second +1));
}
}
s1[i] = tmp;
}
return -1;
}
int DBFS(string beginWord, string endWord, vector<string>& wordList)
{
//对wordList打个表;
unordered_multimap<string, string> dict;
//visited实际上是记录访问的;
unordered_map<string, int> start_visited;
unordered_map<string, int> end_visited;
bool isValid = false;
for (auto& word : wordList) {
if (word == endWord) isValid = true;
string str = word;
for (int i = 0; i < word.size(); i++) {
//string str = word;
str[i] = '*';
dict.emplace(str, word);
str[i] = word[i];
}
}
//如果转换表中没有到结果的转换,那么肯定就不行了;
if (!isValid) return 0;
queue<pair<string, int>> s_qu;
queue<pair<string, int>> e_qu;
s_qu.push(make_pair(beginWord, 1));
e_qu.push(make_pair(endWord, 1));
end_visited.emplace(endWord, 1);
start_visited.emplace(beginWord, 1);
int step = 1;
while (!s_qu.empty() && !e_qu.empty()) {
int ans = visitWordNode(dict, s_qu, start_visited, end_visited);
if (ans > -1) {
return ans;
}
ans = visitWordNode(dict, e_qu, end_visited, start_visited);
if (ans > -1) {
return ans;
}
}
return 0;
}
};
总的来说DBFS相对麻烦一点,多练练就好了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效