สมมติว่าเรามีอาร์เรย์ของ n สตริงที่ไม่ซ้ำกัน เราต้องสร้างตัวย่อที่เป็นไปได้น้อยที่สุดสำหรับทุกคำที่เป็นไปตามกฎด้านล่าง
-
เริ่มต้นด้วยอักขระตัวแรก แล้วตามด้วยจำนวนอักขระย่อ ตามด้วยอักขระตัวสุดท้าย
-
หากเราพบข้อขัดแย้งใดๆ และนั่นคือคำมากกว่าหนึ่งคำที่ใช้ตัวย่อเดียวกัน คุณสามารถใช้คำนำหน้าที่ยาวขึ้นแทนอักขระตัวแรกได้ จนกว่าการทำแผนที่จากคำหนึ่งไปอีกคำย่อจะไม่ซ้ำกัน
-
เมื่อตัวย่อไม่ได้ทำให้คำสั้นลง ก็ให้ใช้คำเดิม
ดังนั้น หากอินพุตเป็นเหมือน ["ชอบ", "พระเจ้า", "ภายใน", "ฉัน", "อินเทอร์เน็ต", "ช่วง", "ความตั้งใจ", "ใบหน้า", "การบุกรุก"] ผลลัพธ์จะเป็น
["l2e","god","internal","me","i6t","interval","inte4n","f2e","intr4n"]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดโครงสร้างโหนด มันมี cnt และอาร์เรย์ของโหนดย่อย 26 โหนด ในขั้นต้นทั้งหมดจะว่างเปล่า
-
กำหนดฟังก์ชั่น freeNode() สิ่งนี้จะเริ่มต้น
-
ถ้า head null แล้ว −
-
กลับ
-
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <26 อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ
-
freeNode(ลูก[i] ของศีรษะ)
-
-
ลบหัว
-
กำหนดฟังก์ชัน insertNode() ซึ่งจะใช้ node, s,
-
curr =โหนด
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
x :=s[i]
-
ถ้าลูก[x - 'a'] ของโหนดไม่เป็นค่าว่าง ดังนั้น
-
ลูก[x - 'a'] ของโหนด :=โหนดใหม่
-
-
โหนด :=ลูก[x - 'a'] ของโหนด
-
เพิ่ม cnt ของโหนดขึ้น 1
-
-
กำหนดฟังก์ชัน abbreviate() ซึ่งจะใช้ node, s,
-
ret :=สตริงว่าง
-
curr =โหนด
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
x :=s[i]
-
curr :=child[x - 'a'] ของสกุลเงิน
-
ถ้า cnt ของ curr เหมือนกับ 1 แล้ว −
-
rem :=ขนาดของ s
-
ret :=(ถ้า rem <=1 แล้ว s มิฉะนั้น สตริงย่อยของ s จากดัชนี 0 ถึง i เชื่อม rem เป็นสตริงที่เชื่อมองค์ประกอบสุดท้ายของ s
-
ออกจากวง
-
-
-
รีเทิร์น
-
กำหนดฟังก์ชัน wordAbbreviation() ซึ่งจะใช้ dict อาร์เรย์
-
n :=ขนาดของ dict
-
กำหนดขนาดของอาร์เรย์ n
-
กำหนดหนึ่งแผนที่
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
word :=dict[i]
-
rem :=ขนาดคำ - 2
-
x :=(ถ้า rem <=1 แล้ว word มิฉะนั้นองค์ประกอบแรกของคำ concatenate rem concatenate องค์ประกอบสุดท้ายของคำ)
-
ใส่ i ต่อท้าย m[x]
-
ret[i] :=x
-
-
สำหรับแต่ละคีย์-ค่าจับคู่ในหน่วย m ให้ทำ -
-
ถ้าขนาดของมันคือ <=1 แล้ว −
-
(เพิ่มขึ้นอีก 1)
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
head :=โหนดใหม่
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของค่าของมัน ให้อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
idx :=value[i] ของมัน
-
insertNode(หัว, dict[idx])
-
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของค่าของมัน ให้อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
idx :=value[i] ของมัน
-
ret[idx] :=ตัวย่อ(หัว, dict[idx])
-
-
freeNode(หัว)
-
(เพิ่มขึ้นอีก 1)
-
-
รีเทิร์น
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } struct Node{ int cnt; Node* child[26]; Node(){ cnt = 0; for(int i = 0; i < 26; i++)child[i] = NULL; } }; class Solution { public: void freeNode(Node* head){ if (!head) return; for (int i = 0; i < 26; i++) { freeNode(head->child[i]); } delete head; } void insertNode(Node* node, string s){ Node* curr = node; for (int i = 0; i < s.size(); i++) { char x = s[i]; if (!node->child[x - 'a']) { node->child[x - 'a'] = new Node(); } node = node->child[x - 'a']; node->cnt++; } } string abbreviate(Node* node, string s){ string ret = ""; Node* curr = node; for (int i = 0; i < s.size(); i++) { char x = s[i]; curr = curr->child[x - 'a']; if (curr->cnt == 1) { int rem = s.size() - (i + 2); ret = rem <= 1 ? s : s.substr(0, i + 1) + to_string(rem) + s.back(); break; } } return ret; } vector<string> wordsAbbreviation(vector<string>& dict) { int n = dict.size(); vector<string> ret(n); map<string, vector<int> > m; for (int i = 0; i < n; i++) { string word = dict[i]; int rem = word.size() - 2; string x = rem <= 1 ? word : word.front() + to_string(rem) + word.back(); m[x].push_back(i); ret[i] = x; } Node* head; map<string, vector<int> >::iterator it = m.begin(); while (it != m.end()) { if (it->second.size() <= 1) { it++; continue; } head = new Node(); for (int i = 0; i < it->second.size(); i++) { int idx = it->second[i]; insertNode(head, dict[idx]); } for (int i = 0; i < it->second.size(); i++) { int idx = it->second[i]; ret[idx] = abbreviate(head, dict[idx]); } freeNode(head); it++; } return ret; } }; main(){ Solution ob; vector<string> v = {"like","god","internal","me","internet","interval","intension","face","intrusion"}; print_vector(ob.wordsAbbreviation(v)); }
อินพุต
{"like","god","internal","me","internet","interval","intension","face","intrusion"}
ผลลัพธ์
[l2e, god, internal, me, i6t, interval, inte4n, f2e, intr4n, ]