สมมติว่าเรามีคำสองคำ (beginWord และ endWord) และเรามีรายการคำศัพท์ในพจนานุกรม ให้ค้นหาความยาวของลำดับการแปลงที่สั้นที่สุดจาก beginWord ถึง endWord เช่นนั้น -
-
แปลงได้ครั้งละหนึ่งตัวอักษรเท่านั้น
-
ในแต่ละคำที่แปลงแล้วจะต้องมีอยู่ในรายการคำศัพท์ BeginWord ไม่ใช่คำที่ถูกแปลง
เราต้องจำไว้ว่า -
-
คืนค่า 0 เมื่อไม่มีลำดับการเปลี่ยนแปลงดังกล่าว
-
ทุกคำมีความยาวเท่ากัน
-
ทุกคำมีเฉพาะตัวพิมพ์เล็กเท่านั้น
-
เราไม่สามารถถือว่าไม่ซ้ำกันในรายการคำ
ดังนั้นหากอินพุตมีลักษณะดังนี้:beginWord ="hit", endWord ="cog" และ wordlist =["hot", "dot", "dog", "lot", "log", "cog"]
จากนั้นผลลัพธ์จะเป็น 5 เนื่องจากการแปลงที่สั้นที่สุดหนึ่งครั้งคือ → hot → dot → dog → cog
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดวิธีการที่เรียกว่า putStar ซึ่งจะใช้ j และ string s สิ่งนี้จะทำงานดังนี้ −
-
temp :=สตริงว่าง
-
สำหรับฉันอยู่ในช่วง 0 ถึงขนาด s – 1
-
ถ้า i =j ให้อัปเดต temp โดยเชื่อม “*” กับมัน มิฉะนั้น ให้อัปเดต temp โดยการต่อ s[i] กับ temp
-
-
ในวิธีการหลักจะใช้สตริง b สตริง e และรายการคำ w ซึ่งจะทำงานดังนี้ -
-
ถ้า e ไม่อยู่ใน w หรือ b ว่างเปล่า หรือ e ว่างเปล่า หรือ w ว่างเปล่า ให้คืนค่า 0
-
กำหนดแผนที่ m สำหรับคีย์ประเภทสตริงและค่าประเภทอาร์เรย์
-
สำหรับฉันอยู่ในช่วง 0 ถึงขนาดของ w
-
x :=w[i]
-
สำหรับ j :=0 ถึงขนาด x
-
อินเตอร์ :=putStar(j, x)
-
แทรก x ลงใน m[inter]
-
-
-
กำหนดคิว q ใส่คู่ (b, 1) ลงใน q
-
ทำแผนที่ชื่อเยี่ยมชม
-
ในขณะที่ q ไม่ว่างเปล่า
-
s :=คู่หน้าจาก q ลบองค์ประกอบด้านหน้าจาก q
-
x :=องค์ประกอบแรกของคู่ s, l :=องค์ประกอบที่สองของคู่ s
-
สำหรับฉันอยู่ในช่วง 0 ถึงขนาดของ x
-
temp :=putStar(i, x)
-
สำหรับ j ในช่วง 0 ถึงขนาด m[temp]
-
aa :=m[temp, j]
-
ถ้า aa เหมือนกับ e ให้คืนค่า l + 1
-
หากไม่ได้ตั้งค่า visit[aa] ให้ใส่คู่ (aa, l + 1) และตั้งค่า visit[aa] =1
-
-
-
-
ระดับ :=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