假设我们有两个单词(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