สมมติว่าเรามีสตริงที่ไม่ว่าง เราต้องเข้ารหัสสตริงนี้เพื่อให้มีความยาวน้อยที่สุด
กฎการเข้ารหัสเป็นเหมือน − k[encoded_string] โดยที่ encoded_string ภายใน [ ] จะถูกทำซ้ำ k ครั้งพอดี เราต้องจำไว้ว่า k จะเป็นจำนวนเต็มบวกและสตริงที่เข้ารหัสจะไม่ว่างเปล่าหรือมีพื้นที่เพิ่มเติม เราสามารถสรุปได้ว่าสตริงอินพุตมีเฉพาะตัวพิมพ์เล็กเท่านั้น หากขั้นตอนการเข้ารหัสไม่ได้ทำให้สตริงสั้นลง ก็อย่าเข้ารหัสสตริงนั้น
ดังนั้น หากอินพุตเป็น "aaaaa" เอาต์พุตจะเป็น "5[a]" เนื่องจาก "5[a]" สั้นกว่า "aaaaa" 1 อักขระ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดอาร์เรย์ 2 มิติหนึ่ง dp
-
กำหนดฟังก์ชั่นการยุบ () ซึ่งจะใช้เวลา s, i, j,
-
temp :=สตริงย่อยของ s จากดัชนี (i ถึง j - i)
-
x :=temp เชื่อมกับ temp
-
pos =ตำแหน่งของอุณหภูมิใน x
-
ถ้า pos>=ขนาดของ temp แล้ว −
-
อุณหภูมิกลับ
-
-
ส่งคืน (ขนาดของ temp / pos) เป็นสตริง จากนั้นต่อ '[' concatenate dp[i,i+pos-1]concatenate ']'
-
กำหนดฟังก์ชัน encode() ซึ่งจะใช้เวลา s
-
n :=ขนาดของ s
-
dp :=กำหนดอาร์เรย์ 2 มิติขนาด n x n
-
สำหรับการเริ่มต้น l :=1 เมื่อ l <=n ปรับปรุง (เพิ่ม l ขึ้น 1) ทำ -
-
สำหรับการเริ่มต้น i :=0, j :=l - 1, เมื่อ j
-
dp[i, j] :=สตริงย่อยของ s จากดัชนี i ถึง j - i
-
สำหรับการเริ่มต้น k :=i เมื่อ k
-
อุณหภูมิ :=dp[i, k] + dp[k + 1, j]
-
ถ้าขนาดของอุณหภูมิ <ขนาดของ dp[i, j] แล้ว −
-
dp[i, j] :=อุณหภูมิ
-
-
-
ตัวแทน :=ยุบ (s, i, j)
-
ถ้าขนาดของตัวแทน <=ขนาดของ dp[i, j] แล้ว −
-
dp[i, j] :=ตัวแทน
-
-
-
-
กลับ dp[0, n - 1]
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: vector<vector<string>> dp; string collapse(string &s, int i, int j) { string temp = s.substr(i, j - i + 1); string x = temp + temp; auto pos = x.find(temp, 1); if (pos >= temp.size()) return temp; return to_string((temp.size() / pos)) + "[" + dp[i][i + pos - 1] + "]"; } string encode(string s) { int n = s.size(); dp = vector<vector<string>>(n, vector<string>(n, "")); for (int l = 1; l <= n; l++) { for (int i = 0, j = l - 1; j < n; i++, j++) { dp[i][j] = s.substr(i, j - i + 1); for (int k = i; k < j; k++) { string temp = dp[i][k] + dp[k + 1][j]; if (temp.size() < dp[i][j].size()) { dp[i][j] = temp; } } string rep = collapse(s, i, j); if (rep.size() <= dp[i][j].size()) { dp[i][j] = rep; } } } return dp[0][n - 1]; } }; main() { Solution ob; cout << (ob.encode("bbbbbbbbbb")); }
อินพุต
"bbbbbbbbbb"
ผลลัพธ์
"10[b]"