สมมติว่ามีคำ เราต้องกำหนดฟังก์ชันที่สามารถสร้างตัวย่อทั่วไปของคำได้
ดังนั้น หากอินพุตเป็นเหมือน "word" ผลลัพธ์จะเป็น ["word", "1ord", "w1rd", "wo1d", "wor1", "2rd", "w2d", "wo2", " 1o1d", "1or1", "w1r1", "1o2", "2r1", "3d", "w3", "4"]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดอาร์เรย์ ret
-
กำหนดฟังก์ชัน Solve() ซึ่งจะใช้เวลา s, idx
-
ถ้า idx>=ขนาดของ s แล้ว −
-
ใส่ s ต่อท้าย ret
-
กลับ
-
-
y :=สตริงย่อยของ s จากดัชนี 0 ถึง idx - 1
-
ผม :=ขนาดของ y
-
num :=สตริงว่าง
-
ในขณะที่ (i>=0 และ y[i] <=ASCII ของ '9' และ y[i]>=ASCII ของ '0') ทำ -
-
num :=y[i] + num
-
(ลดลง 1)
-
-
ถ้าฉันไม่เท่ากับขนาดของ y แล้ว −
-
ret :=สตริงย่อยของ s จากดัชนี (0 ถึง idx - (ขนาดของ y - 1 - i) - 1) ต่อกัน (หมายเลข + 1) เป็นสตริงที่เชื่อมสตริงย่อยของ s จากดัชนี (0 ถึง idx)
-
s1 :=num + 1 เป็นสตริง
-
s2 :=num เป็นสตริง
-
ถ้าขนาดของ s1 เท่ากับขนาดของ s2 ดังนั้น −
-
มิฉะนั้น
-
แก้(ret, idx + 1)
-
-
-
มิฉะนั้น
-
ก่อนหน้า :=s[idx]
-
s[idx] :='1'
-
แก้(s, idx + 1)
-
s[idx] :=ก่อนหน้า
-
-
แก้(s, idx + 1)
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
แก้(คำ, 0)
-
รีเทิร์น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#includeใช้เนมสเปซ std;void print_vector(vector ret; โมฆะแก้ (สตริง s, int idx){ ถ้า (idx>=s.size ()) { ret.push_back (s); กลับ; } สตริง y =s.substr(0, idx); int i =y.size() - 1; สตริง num =""; ในขณะที่ (i>=0 &&y[i] <='9' &&y[i]>='0') { num =y[i] + num; ฉัน--; } if (i !=y.size() - 1) { string ret =s.substr(0, idx - (y.size() - 1 - i)) + to_string(stoi(num) + 1) + s .substr(idx + 1); สตริง s1 =to_string(stoi(num) + 1); สตริง s2 =to_string(stoi(num)); ถ้า (s1.size() ==s2.size()) แก้ (ret, idx); อย่างอื่นแก้(ret, idx + 1); } อื่น ๆ { ถ่านก่อนหน้า =s[idx]; s[idx] ='1'; แก้(s, idx + 1); s[idx] =ก่อนหน้า; } แก้ (s, idx + 1); } vector อินพุต
สวัสดีผลลัพธ์
<ก่อน>[5, 4o, 3l1, 3lo, 2l2, 2l1o, 2ll1, 2llo, 1e3, 1e2o, 1e1l1, 1e1lo, 1el2, 1el1o, 1ell1, 1ello, h4, h3o, h2l1, h2lo, h1l1, h h1llo, he3, he2o, he1l1, he1lo, hel2, hel1o, hell1, สวัสดี ]