- Data Structure
- Networking
- RDBMS
- Operating System
- Java
- MS Excel
- iOS
- HTML
- CSS
- Android
- Python
- C Programming
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP
- Physics
- Chemistry
- Biology
- Mathematics
- English
- Economics
- Psychology
- Social Studies
- Fashion Studies
- Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Word Ladder in C++
Suppose we have two words (beginWord and endWord), and we have dictionary's word list, find the length of shortest transformation sequence from beginWord to endWord, such that −
Only one letter can be converted at a time.
In each transformed word must exist in the word list. The beginWord is not a transformed word.
We have to keep in mind that −
Return 0 when there is no such change sequence.
All words have the same length.
All words contain only lowercase characters.
We can assume no duplicates in the word list.
So if the input is like: beginWord = "hit", endWord = "cog", and wordlist = ["hot", "dot", "dog", "lot", "log", "cog"]
Then the output will be 5, as one shortest transformation is hit → hot → dot → dog → cog
To solve this, we will follow these steps −
Define a method called putStar, this will take j and string s. This will work as follows −
temp := empty string
for i in range 0 to size of s – 1
if i = j, then update temp by concatenating “*” with it, otherwise update temp by concatenating s[i] with temp.
in the main method it will take string b, string e and list of words w, this will work like −
if e is not in w, or b is empty, or e is empty, or w is empty, then return 0
define a map m for string type key and array type value.
for i in range 0 to size of w
x := w[i]
for j := 0 to size of x
inter := putStar(j, x)
insert x into m[inter]
Define a queue q, insert a pair (b, 1) into q
make a map called visited
while q is not empty
s := front pair from q, delete front element from q
x := first element of the pair s, l := second element of the pair s
for i in range 0 to size of x
temp := putStar(i, x)
for j in range 0 to size of m[temp]
aa := m[temp, j]
if aa is same as e, then return l + 1
if visited[aa] is not set, then insert pair (aa, l + 1), and set visited[aa] = 1
level := 0
return 0
Example
Let us see the following implementation to get a better understanding −
#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)); }
Input
"hit" "cog" ["hot","dot","dog","lot","log","cog"]
Output
5