
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Find All Possible IP Addresses After Restoration in C++
Suppose we have a string with only digits, we have to restore it by forming all possible valid IP address combinations. We know that a valid IP address consists of exactly four integers (each integer is in range 0 to 255) separated by single period symbol.
So, if the input is like ip = "25525511136", then the output will be ["254.25.40.123", "254.254.0.123"]
To solve this, we will follow these steps −
- Define a function convertToNum(), this will take s, start, end,
- num := 0
- for initialize i := start, when i <= end, update (increase i by 1), do −
- num := (num * 10) + (s[i] - ASCII of '0')
- if num > 255, then −
- return 10000
- return num
- Define a function addDots(), this will take positions,
- res := blank string
- x := 0, posIndex := 0
- for initialize i := 0, when i < size of positions, update (increase i by 1), do −
- num := positions[i]
- create one string str1
- temp := num as string
- res := res + temp
- if i < size of positions, then −
- res := res concatenate "."
- return res
- Define a function solve(), this will take s, one string array result, an array positions, dotCount, this is initialize it with 3, startIndex, this is initialize it with 0,
- if not dotCount is non-zero and ((size of s - 1) - startIndex + 1) 1, then −
- temp := convertToNum(s, startIndex, size of s)
- if temp >= 0 and temp <= 255, then −
- insert temp at the end of positions
- res := addDots(positions)
- if size of res is same as size of s, then −
- insert res at the end of result
- return
- for initialize i := startIndex, when i < size of s, update (increase i by 1), do −
- temp := convertToNum(s, startIndex, i)
- if temp >= 0 and temp <= 255, then −
- insert temp at the end of positions
- solve(s, result, positions, dotCount - 1, i + 1)
- delete last element from positions
- Define one function genIp this will take a string s
- Define an array result
- Define an array position
- solve(s, result, position)
- return result
- From the main method call genIp(A)
Example (C++)
Let us see the following implementation to get better understanding −
#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)); }
Input
25525511136
Output
[255.255.11.136, 255.255.111.36, ]
Advertisements