假设我们有两个单词(beginWord和endWord),并且我们有字典的单词列表,找到从beginWord到endWord的最短转换序列的长度,例如-
一次只能转换一个字母。
在每个转换的单词中,单词列表中都必须存在。beginWord不是转换后的单词。
我们必须记住-
如果没有这样的更改序列,则返回0。
所有单词的长度相同。
所有单词仅包含小写字符。
我们可以假设单词列表中没有重复项。
因此,如果输入类似于:beginWord =“ hit”,endWord =“ cog”和wordlist = [“ hot”,“ dot”,“ dog”,“ lot”,“ log”,“ cog”]
然后输出为5,因为命中了最短的变换→热→点→狗→齿轮
为了解决这个问题,我们将遵循以下步骤-
定义一个名为putStar的方法,它将使用j和string。这将如下工作-
temp:=空字符串
当我的范围是0到s的大小– 1
如果i = j,则通过将“ *”串联来更新温度,否则将s [i]与温度串联来更新温度。
在main方法中,它将采用字符串b,字符串e和单词列表w,这将类似于-
如果e不在w中,或者b为空,或者e为空,或者w为空,则返回0
为字符串类型键和数组类型值定义映射m。
对于范围0到w的i
内部:= putStar(j,x)
将x插入m [inter]
x:= w [i]
对于j:= 0到x的大小
定义队列q,在q中插入一对(b,1)
制作一张称为访问过的映射
当q不为空时
temp:= putStar(i,x)
对于范围从0到m [temp]的j
aa:= m [temp,j]
如果aa与e相同,则返回l + 1
如果未设置Visited [aa],则插入对(aa,l + 1),并设置Visited [aa] = 1
s:= q中的前对,从q中删除前元素
x:=对s的第一个元素,l:=对s的第二个元素
对于0到x范围内的i
等级:= 0
返回0
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: string putStar(int j, string s){ string temp = ""; for(int i = 0; i < s.size(); i++){ if(i == j)temp += "*"; else temp += s[i]; } return temp; } int ladderLength(string b, string e, vector<string>& w) { if(find(w.begin(), w.end(), e) == w.end() || !b.size() || !e.size() || !w.size())return 0; map < string , vector <string> > m; for(int i = 0; i < w.size(); i++){ string x = w[i]; for(int j = 0; j < x.size(); j++){ string inter = putStar(j,x); m[inter].push_back(x); } } queue < pair <string, int> > q; q.push({b, 1}); map <string, int> visited; while(!q.empty()){ pair < string, int > s = q.front(); q.pop(); string x = s.first; int l = s.second; for(int i = 0; i < x.size(); i++){ string temp = putStar(i ,x); for(int j = 0; j < m[temp].size(); j++){ string aa = m[temp][j]; if(aa == e)return l+1; if(!visited[aa]){ q.push({aa, l+1}); visited[aa] = 1; } } } } int level = 0; return 0; } }; main(){ vector<string> v = {"hot","dot","dog","lot","log","cog"}; Solution ob; cout << (ob.ladderLength("hit", "cog", v)); }
"hit" "cog" ["hot","dot","dog","lot","log","cog"]
输出结果
5