สมมติว่าเรามีสตริงที่มีตัวเลขเท่านั้น เราต้องกู้คืนโดยส่งคืนชุดค่าผสมที่อยู่ IP ที่เป็นไปได้ทั้งหมด เรารู้ว่าที่อยู่ IP ที่ถูกต้องประกอบด้วยจำนวนเต็มสี่จำนวน (แต่ละจำนวนเต็มอยู่ในช่วง 0 ถึง 255) คั่นด้วยจุดเดียว
ดังนั้น หากอินพุตเป็น "25525511135" เอาต์พุตจะเป็น ["255.255.11.135", "255.255.111.35"]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน convertToNum() ซึ่งจะใช้เวลา s เริ่มต้น สิ้นสุด
-
num :=0
-
สำหรับการเริ่มต้น i :=start เมื่อฉัน <=end อัปเดต (เพิ่ม 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 เมื่อฉัน
-
temp :=convertToNum(s, startIndex, i)
-
ถ้า temp> =0 และ temp <=255 แล้ว −
-
ใส่อุณหภูมิที่ส่วนท้ายของตำแหน่ง
-
แก้ (s, ผลลัพธ์, ตำแหน่ง, dotCount - 1, i + 1)
-
ลบองค์ประกอบสุดท้ายออกจากตำแหน่ง
-
-
-
กำหนดหนึ่งฟังก์ชัน genIp ซึ่งจะใช้สตริง s
-
กำหนดผลลัพธ์อาร์เรย์
-
กำหนดตำแหน่งอาร์เรย์
-
แก้ (s, ผลลัพธ์, ตำแหน่ง)
-
ส่งคืนผลลัพธ์
-
จากการเรียกเมธอดหลัก genIp(A)
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#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> restoreIpAddresses(string A) { return genIp(A); }}; main(){ Solution ob; print_vector(ob.restoreIpAddresses("25525511135")); }
อินพุต
"25525511135"
ผลลัพธ์
[255.255.11.135, 255.255.111.35, ]