Giả sử có một từ. Chúng ta phải xác định một hàm có thể tạo ra các chữ viết tắt tổng quát của một từ.
Vì vậy, nếu đầu vào là "word", thì đầu ra sẽ là ["word", "1ord", "w1rd", "wo1d", "wor1", "2rd", "w2d", "wo2", " 1o1d "," 1or1 "," w1r1 "," 1o2 "," 2r1 "," 3d "," w3 "," 4 "]
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Xác định ret mảng
-
Xác định một hàm giải quyết (), điều này sẽ nhận s, idx,
-
nếu idx> =kích thước của s, thì -
-
chèn s vào cuối ret
-
trở lại
-
-
y:=chuỗi con của s từ chỉ mục 0 đến idx - 1
-
i:=kích thước của y
-
num:=chuỗi trống
-
while (i> =0 and y [i] <=ASCII of '9' and y [i]> =ASCII of '0'), do -
-
num:=y [i] + num
-
(giảm i đi 1)
-
-
nếu tôi không bằng kích thước của y, thì -
-
ret:=chuỗi con của s từ chỉ mục (0 đến idx - (kích thước của y - 1 - i) - 1) nối (số + 1) dưới dạng chuỗi nối chuỗi con của s từ chỉ mục (0 đến idx)
-
s1:=num + 1 dưới dạng chuỗi
-
s2:=num dưới dạng chuỗi
-
nếu kích thước của s1 giống với kích thước của s2, thì -
-
Nếu không
-
giải quyết (ret, idx + 1)
-
-
-
Nếu không
-
trước:=s [idx]
-
s [idx]:='1'
-
giải quyết (s, idx + 1)
-
s [idx]:=trước
-
-
giải quyết (s, idx + 1)
-
Từ phương thức chính, hãy làm như sau -
-
giải quyết (từ, 0)
-
trả lại ret
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#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 idx){ if (idx >= s.size()) { ret.push_back(s); return; } string y = s.substr(0, idx); int i = y.size() - 1; string num = ""; while (i >= 0 && y[i] <= '9' && y[i] >= '0') { num = y[i] + num; i--; } if (i != y.size() - 1) { string ret = s.substr(0, idx - (y.size() - 1 - i)) + to_string(stoi(num) + 1) + s.substr(idx + 1); string s1 = to_string(stoi(num) + 1); string s2 = to_string(stoi(num)); if (s1.size() == s2.size()) solve(ret, idx); else solve(ret, idx + 1); } else { char prev = s[idx]; s[idx] = '1'; solve(s, idx + 1); s[idx] = prev; } solve(s, idx + 1); } vector<string< generateAbbreviations(string word){ solve(word, 0); return ret; } }; main(){ Solution ob; print_vector(ob.generateAbbreviations("hello")); }
Đầu vào
hello
Đầu ra
[5, 4o, 3l1, 3lo, 2l2, 2l1o, 2ll1, 2llo, 1e3, 1e2o, 1e1l1, 1e1lo, 1el2, 1el1o, 1ell1, 1ello, h4, h3o, h2l1, h2lo, h1l2, h1l1o, h1ll1, h1llo, he3, he2o, he1l1, he1lo, hel2, hel1o, hell1, hello, ]