สมมติว่าเรามีสตริงที่มีตัวเลขเท่านั้น เราต้องกู้คืนโดยสร้างชุดค่าผสมที่อยู่ IP ที่เป็นไปได้ทั้งหมด เรารู้ว่าที่อยู่ IP ที่ถูกต้องประกอบด้วยจำนวนเต็มสี่จำนวน (แต่ละจำนวนเต็มอยู่ในช่วง 0 ถึง 255) คั่นด้วยสัญลักษณ์จุดเดียว
ดังนั้น หากอินพุตเป็นเหมือน ip ="25525511136" ผลลัพธ์จะเป็น ["254.25.40.123", "254.254.0.123"]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน convertToNum() ซึ่งจะใช้เวลา s เริ่มต้น สิ้นสุด
- num :=0
- สำหรับการเริ่มต้น i :=เริ่ม เมื่อฉัน <=สิ้นสุด อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
- num :=(num * 10) + (s[i] - ASCII of '0')
- ถ้า num> 255 แล้ว −
- คืน 10000
- หมายเลขส่งคืน
- กำหนดฟังก์ชัน addDots() ซึ่งจะรับตำแหน่ง
- res :=สตริงว่าง
- x :=0, posIndex :=0
- สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของตำแหน่ง อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
- num :=ตำแหน่ง[i]
- สร้างหนึ่งสตริง str1
- temp :=num เป็นสตริง
- res :=res + อุณหภูมิ
- ถ้าฉัน <ขนาดของตำแหน่ง แล้ว −
- res :=res concatenate "."
- ผลตอบแทน
- กำหนดฟังก์ชัน Solve() จะใช้ s หนึ่งผลลัพธ์อาร์เรย์สตริง ตำแหน่งอาร์เรย์ dotCount นี่คือการเริ่มต้นด้วย 3 startIndex นี่คือการเริ่มต้นด้วย 0
- ถ้าไม่ใช่ dotCount แสดงว่าไม่ใช่ศูนย์ และ ((ขนาดของ s - 1) - startIndex + 1) 1 แล้ว −
- temp :=convertToNum(s, startIndex, size of s)
- ถ้า temp>
=0 และ temp <=255 แล้ว −
- ใส่อุณหภูมิที่ส่วนท้ายของตำแหน่ง
- res :=addDots(ตำแหน่ง)
- ถ้าขนาดของ res เท่ากับขนาดของ s แล้ว −
- ใส่ res ที่ท้ายผลลัพธ์
- คืนสินค้า
- สำหรับการเริ่มต้น i :=startIndex เมื่อฉัน <ขนาดของ s อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
- temp :=convertToNum(s, startIndex, i)
- ถ้า temp>
=0 และ temp <=255 แล้ว −
- ใส่อุณหภูมิที่ส่วนท้ายของตำแหน่ง
- แก้(s, ผลลัพธ์, ตำแหน่ง, dotCount - 1, i + 1)
- ลบองค์ประกอบสุดท้ายออกจากตำแหน่ง
- กำหนดหนึ่งฟังก์ชัน genIp ซึ่งจะรับสตริง s
- กำหนดผลลัพธ์อาร์เรย์
- กำหนดตำแหน่งอาร์เรย์
- แก้(s,ผลลัพธ์,ตำแหน่ง)
- ผลตอบแทน
- จากการเรียกเมธอดหลัก genIp(A)
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#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));
} อินพุต
25525511136
ผลลัพธ์
[255.255.11.136, 255.255.111.36, ]