สมมติว่าเรามีชุดคำ (ทั้งหมดไม่ซ้ำกัน) เราต้องหาช่องคำศัพท์ทั้งหมดและเราสามารถสร้างจากคำเหล่านั้นได้ ในที่นี้ ลำดับของคำจะสร้างช่องสี่เหลี่ยมคำที่ถูกต้อง ถ้าแถวและคอลัมน์ที่ k อ่านสตริงเดียวกันทุกประการ โดยที่ 0 ≤ k <สูงสุดของ numRows และ numColumns ตัวอย่างเช่น ลำดับคำ ["ball","area","lead","lady"] จะสร้างช่องคำศัพท์ขึ้นเนื่องจากแต่ละคำอ่านเหมือนกันทั้งในแนวนอนและแนวตั้ง
b | a | l | l |
a | r | จ | a |
l | จ | a | d |
l | a | d | y |
ดังนั้น หากอินพุตเป็นเหมือน ["area","lead","wall","lady","ball"] เอาต์พุตจะเป็น [[ "wall", "area" , "ตะกั่ว", "ผู้หญิง"], ["บอล", "พื้นที่", "ตะกั่ว", "ผู้หญิง"]]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดโครงสร้างโหนด โดยจะมีตัวแปร isEnd และรายการโหนดย่อย
-
กำหนดอาร์เรย์ 2D ret หนึ่งรายการ
-
กำหนดฟังก์ชัน insertNode() นี้จะใช้หัว s,
-
โหนด :=หัว
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
x :=s[i]
-
หากอาร์เรย์ย่อยของโหนดว่างเปล่า −
-
ลูก[x] ของโหนด :=โหนดใหม่
-
-
โหนด :=ลูก[x] ของโหนด
-
-
isEnd ของโหนด :=จริง
-
กำหนดฟังก์ชันที่เรียกว่า getAllWords ซึ่งจะใช้ idx, prefixm node และ temp array
-
หากโหนดว่างเปล่า −
-
กลับ
-
-
ถ้า isEnd ของโหนดเป็นจริง −
-
ใส่ curr ที่จุดสิ้นสุดของอุณหภูมิ
-
กลับ
-
-
ถ้า idx>=ขนาดของคำนำหน้า −
-
สำหรับแต่ละโหนดในโหนดย่อย -
-
getAllWords(idx, prefix, it.second, temp, curr + it.first)
-
-
-
มิฉะนั้น −
-
x :=คำนำหน้า[idx]
-
ถ้าลูกของโหนดไม่ว่างเปล่า −
-
กลับ
-
-
getAllWords(idx + 1, คำนำหน้า, ลูก[x] ของโหนด, temp, curr + x)
-
-
กำหนดฟังก์ชัน Solve() ซึ่งจะใช้อาร์เรย์ temp, idx, reqSize, head,
-
ถ้า idx เหมือนกับ reqSize แล้ว −
-
ใส่ temp ที่ท้าย ret
-
กลับ
-
-
คำนำหน้า :=สตริงว่าง
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
คำนำหน้า :=คำนำหน้า + อุณหภูมิ[i, idx]
-
-
กำหนดอาร์เรย์ที่เป็นไปได้
-
curr =หัว
-
getAllWords(0, คำนำหน้า, สกุลเงิน, เป็นไปได้)
-
สำหรับการเริ่มต้น i :=0 เมื่อฉัน <ขนาดที่เป็นไปได้ ให้อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
s :=เป็นไปได้[i]
-
ใส่ s เมื่อสิ้นสุดอุณหภูมิ
-
แก้ (temp, idx + 1, reqSize, head)
-
ลบองค์ประกอบสุดท้ายออกจาก temp
-
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
หัว =โหนดใหม่
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของคำ อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
insertNode(หัว, คำ[i])
-
-
กำหนดอุณหภูมิอาร์เรย์
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของคำ อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
s :=คำ[i]
-
ใส่ s เมื่อสิ้นสุดอุณหภูมิ
-
แก้ (ชั่วคราว 1 ขนาดของคำ[0] หัว)
-
ลบองค์ประกอบสุดท้ายออกจาก temp
-
-
รีเทิร์น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; void print_vector(vector<vector<auto>> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << "["; for(int j = 0; j <v[i].size(); j++){ cout << v[i][j] << ", "; } cout << "],"; } cout << "]"<<endl; } struct Node { bool isEnd; map<char, Node *> child; }; class Solution { public: vector<vector<string>> ret; void insertNode(Node *head, string &s) { Node *node = head; for (int i = 0; i < s.size(); i++) { char x = s[i]; if (!node->child[x]) { node->child[x] = new Node(); } node = node->child[x]; } node->isEnd = true; } void getAllWords(int idx, string prefix, Node *node, vector<string>&temp, string curr = "") { if (!node) return; if (node->isEnd) { temp.push_back(curr); return; } if (idx >= prefix.size()) { for (auto &it : node->child) { getAllWords(idx, prefix, it.second, temp, curr + it.first); } } else { char x = prefix[idx]; if (!node->child[x]) return; getAllWords(idx + 1, prefix, node->child[x], temp, curr + x); } } void solve(vector<string> &temp, int idx, int reqSize, Node *head){ if (idx == reqSize) { ret.push_back(temp); return; } string prefix = ""; for (int i = 0; i < temp.size(); i++) { prefix += temp[i][idx]; } vector<string> possible; Node *curr = head; getAllWords(0, prefix, curr, possible); for (int i = 0; i < possible.size(); i++) { string s = possible[i]; temp.push_back(s); solve(temp, idx + 1, reqSize, head); temp.pop_back(); } } vector<vector<string>> wordSquares(vector<string> &words) { ret.clear(); Node *head = new Node(); for (int i = 0; i < words.size(); i++) { insertNode(head, words[i]); } vector<string> temp; for (int i = 0; i < words.size(); i++) { string s = words[i]; temp.push_back(s); solve(temp, 1, (int)words[0].size(), head); temp.pop_back(); } return ret; } }; main() { Solution ob; vector<string> v = {"area", "lead", "wall", "lady", "ball"}; print_vector(ob.wordSquares(v)); }
อินพุต
{"area", "lead", "wall", "lady", "ball"}
ผลลัพธ์
[[wall, area, lead, lady, ],[ball, area, lead, lady, ],]