Giả sử chúng ta có một chuỗi chỉ có các chữ số, chúng ta phải khôi phục nó bằng cách tạo tất cả các tổ hợp địa chỉ IP hợp lệ có thể có. Chúng tôi biết rằng một địa chỉ IP hợp lệ bao gồm chính xác bốn số nguyên (mỗi số nguyên nằm trong phạm vi từ 0 đến 255) được phân tách bằng ký hiệu dấu chấm.
Vì vậy, nếu đầu vào là ip ="25525511136", thì đầu ra sẽ là ["254.25.40.123", "254.254.0.123"]
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- Xác định một hàm convertToNum (), hàm này sẽ có s, bắt đầu, kết thúc,
- num:=0
- để khởi tạo i:=start, khi i <=end, update (tăng i lên 1), thực hiện -
- num:=(num * 10) + (s [i] - ASCII của '0')
- nếu num> 255, thì -
- trả lại 10000
- trả về num
- Xác định một hàm addDots (), hàm này sẽ có các vị trí,
- res:=chuỗi trống
- x:=0, posIndex:=0
- để khởi tạo i:=0, khi i
- num:=vị trí [i]
- tạo một chuỗi str1
- temp:=num dưới dạng chuỗi
- res:=res + temp
- nếu tôi
- res:=res concatenate "."
- temp:=convertToNum (s, startIndex, size of s)
- nếu nhiệt độ> =0 và nhiệt độ <=255, thì -
- chèn nhiệt độ vào cuối các vị trí
- res:=addDots (vị trí)
- nếu kích thước của res giống với kích thước của s, thì -
- chèn res vào cuối kết quả
- trở lại
- chèn nhiệt độ vào cuối các vị trí
- giải quyết (s, kết quả, vị trí, dotCount - 1, i + 1)
- xóa phần tử cuối cùng khỏi các vị trí
Ví dụ (C ++)
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; } typedef long long int lli; class Solution { public: lli convertToNum(string s,int start, int end){ lli num = 0; for (int i = start; i <= end; i++) { num = (num * 10) + (s[i] - '0'); if (num > 255) return 10000; } return num; } string addDots(vector <int> positions){ string res = ""; int x = 0; int posIndex = 0; for (int i = 0; i < positions.size(); i++) { int num = positions[i]; ostringstream str1; str1 << num; string temp = str1.str(); res += temp; if (i < positions.size() - 1) res += "."; } return res; } void solve(string s, vector <string> &result,vector <int> positions, int dotCount = 3, int startIndex = 0){ if (!dotCount && ((s.size() - 1) - startIndex + 1) >= 1) { int temp = convertToNum(s, startIndex, s.size() - 1); if (temp >= 0 && temp <= 255) { positions.push_back(temp); string res = addDots(positions); if (res.size() - 3 == s.size()) { result.push_back(res); } } return; } for (int i = startIndex; i < s.size(); i++) { int temp = convertToNum(s, startIndex, i); if (temp >= 0 && temp <= 255) { positions.push_back(temp); solve(s, result, positions, dotCount - 1, i + 1); positions.pop_back(); } } } vector<string> genIp(string s){ vector<string> result; vector<int> position; solve(s, result, position); return result; } vector<string> get_ip(string A) { return genIp(A); }}; main(){ Solution ob; string ip = "25525511136"; print_vector(ob.get_ip(ip)); }
Đầu vào
25525511136
Đầu ra
[255.255.11.136, 255.255.111.36, ]