Computer >> Máy Tính >  >> Lập trình >> C ++

Viết tắt tổng quát trong C ++

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, ]