สมมติว่าเรามีสตริง s เราต้องหาการเรียงสับเปลี่ยนพาลินโดรมทั้งหมดของมัน จะไม่มีการซ้ำซ้อน หากไม่มีการเรียงสับเปลี่ยนพาลินโดรม ก็ให้คืนค่าสตริงว่าง
ดังนั้น หากอินพุตเป็นเหมือน "aabb" ผลลัพธ์จะเป็น ["abba", "baab"]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดอาร์เรย์ ret
-
กำหนดฟังก์ชัน แก้ไข () ซึ่งจะใช้เวลา s, sz, หนึ่งแผนที่ที่ไม่เรียงลำดับ m, idx เริ่มต้นด้วย 0
-
ถ้า sz เท่ากับ 0 แล้ว −
-
ใส่ s ต่อท้าย ret
-
กลับ
-
-
evenFound :=เท็จ
-
กำหนดการเยี่ยมชมหนึ่งชุด
-
สำหรับคู่คีย์-ค่าแต่ละคู่เป็น m ให้ทำ -
-
ถ้าค่าของมันเป็นศูนย์ ดังนั้น −
-
(เพิ่มขึ้นอีก 1)
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
มิฉะนั้นเมื่อค่าเท่ากับ 1 แล้ว −
-
oddChar :=คีย์ของมัน
-
-
มิฉะนั้น
-
ถ้าคีย์ไม่เข้าก็
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
s[idx] :=คีย์ของมัน
-
s[ขนาดของ s - 1 - idx] =คีย์ของมัน
-
evenFound :=จริง
-
m[คีย์ของมัน] :=m[คีย์ของมัน] - 2
-
แก้(s, sz - 2, m, idx + 1)
-
m[คีย์ของมัน] :=m[คีย์ของมัน] + 2
-
ใส่คีย์ของมันลงในการเยี่ยมชม
-
-
(เพิ่มขึ้นอีก 1)
-
-
ถ้าพบเท็จแล้ว −
-
s[idx] :=oddChar
-
แก้(s, sz - 1, m, idx + 1)
-
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
กำหนดหนึ่งแผนที่ cnt
-
n :=ขนาดของ s
-
temp :=สตริงว่าง
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
(เพิ่ม cnt[s[i]] ขึ้น 1)
-
temp :=temp concatenate " * "
-
-
oddCnt :=0
-
สำหรับคู่คีย์-ค่าแต่ละคู่เป็น cnt ให้ทำ -
-
เพิ่ม oddCount เมื่อค่าของมันเป็นเลขคี่
-
(เพิ่มขึ้นอีก 1)
-
-
ถ้า oddCnt> 1 แล้ว −
-
รีเทิร์น
-
-
แก้ (อุณหภูมิ n, cnt)
-
รีเทิร์น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#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; } class Solution { public: vector<string> ret; void solve(string s, int sz, unordered_map<char,int>& m, int idx = 0){ if (sz == 0) { ret.push_back(s); return; } bool evenFound = false; char oddChar; unordered_map<char, int>::iterator it = m.begin(); set<char> visited; while (it != m.end()) { if (!it->second) { it++; continue; } else if (it->second == 1) { oddChar = it->first; } else { if (visited.count(it->first)) continue; s[idx] = it->first; s[s.size() - 1 - idx] = it->first; evenFound = true; m[it->first] -= 2; solve(s, sz - 2, m, idx + 1); m[it->first] += 2; visited.insert(it->first); } it++; } if (!evenFound) { s[idx] = oddChar; solve(s, sz - 1, m, idx + 1); } } vector<string< generatePalindromes(string s){ unordered_map<char,int> cnt; int n = s.size(); string temp = ""; for (int i = 0; i < n; i++) { cnt[s[i]]++; temp += "*"; } int oddCnt = 0; unordered_map<char, int>::iterator it = cnt.begin(); while (it != cnt.end()) { oddCnt += (it->second & 1); it++; } if (oddCnt > 1) return ret; solve(temp, n, cnt); return ret; } }; main(){ Solution ob; print_vector(ob.generatePalindromes("aabb")); }
อินพุต
"aabb"
ผลลัพธ์
[baab, abba, ]