Last active
July 13, 2019 17:10
-
-
Save madhur/099f69dbddc84824445cef126dc5bfd2 to your computer and use it in GitHub Desktop.
IP Matching
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// java.util.* and java.util.streams.* have been imported for this problem. | |
// You don't need any other imports. | |
public static ArrayList<String> generateIPAddrs(String s) { | |
Stack<IpLevelNode> st = new Stack<>(); | |
ArrayList<String> answer = new ArrayList<>(); | |
Character c = s.charAt(0); | |
Integer numValue = Character.getNumericValue(c); | |
st.push( new IpLevelNode(String.valueOf(numValue), 1, s.substring(1))); | |
// st.push( new IpLevelNode(String.valueOf(numValue)+".", 1, s.substring(1))); | |
System.out.println("first:" + st.peek().predecessor + "," + st.peek().successor + " Level " + st.peek().level); | |
while(!st.empty()) { | |
IpLevelNode node1 = st.pop(); | |
Character c1 = node1.successor.charAt(0); | |
String newp; | |
Integer num=0; | |
if(node1.predecessor.charAt(node1.predecessor.length()-1) =='.') { | |
newp = String.valueOf(c1); | |
num = Integer.valueOf(newp); | |
} | |
else { | |
newp = node1.predecessor + String.valueOf(c1); // newp=1921 | |
int lastIndex = newp.lastIndexOf("."); | |
if(lastIndex > -1) { | |
String newpsub = newp.substring(lastIndex+1); | |
num = Integer.valueOf(newpsub); | |
} | |
else { | |
num = Integer.valueOf(newp); | |
} | |
} | |
if(node1.successor.length() > 1 && node1.level < 5) { | |
if(num > 255) { | |
addpartitions(st, node1, c1); | |
newp = String.valueOf(c1); | |
if(node1.predecessor.charAt(node1.predecessor.length()-1)=='.') | |
st.push(new IpLevelNode(node1.predecessor + newp, node1.level+1, node1.successor.substring(1))); | |
else | |
st.push(new IpLevelNode(node1.predecessor + "." + newp, node1.level+1, node1.successor.substring(1))); | |
System.out.println("add2:" + st.peek().predecessor + "," + st.peek().successor + " Level " + st.peek().level); | |
} | |
else { | |
addpartitions(st, node1, c1); | |
if(node1.predecessor.charAt(node1.predecessor.length()-1)=='.') { | |
st.push(new IpLevelNode(node1.predecessor + newp, node1.level, node1.successor.substring(1))); | |
} | |
else if (getLastPart(newp).length() <4) { | |
st.push(new IpLevelNode(newp, node1.level, node1.successor.substring(1))); | |
} | |
System.out.println("add3:" + st.peek().predecessor + "," + st.peek().successor + " Level " + st.peek().level); | |
} | |
} | |
else { | |
if(node1.level+1 == 4) { | |
if(num > 255) { | |
newp = String.valueOf(c1); | |
System.out.println("Answer1: " + node1.predecessor + "." + newp); | |
answer.add(node1.predecessor + "." + newp); | |
addpartitions(st, node1, c1); | |
} | |
else { | |
System.out.println("Answer3: "+ newp); | |
newp = String.valueOf(c1); | |
answer.add(node1.predecessor +"." + newp); | |
} | |
} | |
else if (node1.level==4 && node1.successor.length()==1) { | |
int lastIndex = node1.predecessor.lastIndexOf("."); | |
String ss = node1.predecessor.substring(lastIndex+1) + node1.successor; | |
if (Integer.valueOf(ss) < 256) { | |
System.out.println("Answer2: " + node1.predecessor + node1.successor); | |
answer.add(node1.predecessor + node1.successor); | |
} | |
} | |
} | |
} | |
return new ArrayList(new HashSet<String>(answer)); | |
} | |
private static void addpartitions(Stack<IpLevelNode> st, IpLevelNode node1, Character c1) { | |
String newp = String.valueOf(c1); | |
int dotIndex = node1.predecessor.lastIndexOf("."); | |
String partitionNumber; | |
boolean level = false; | |
if(dotIndex > -1) { | |
partitionNumber = node1.predecessor.substring(dotIndex+1); | |
level = true; | |
} | |
else { | |
partitionNumber= node1.predecessor; | |
level = false; | |
} | |
System.out.println("partition: " + partitionNumber); | |
for(int i=0;i<partitionNumber.length(); ++i) { | |
String newNumber = new StringBuilder(partitionNumber).insert(i+1, '.').toString(); | |
if(level) { | |
System.out.println("addp1: " + node1.predecessor + ", " + removeLastPart(node1.predecessor) ); | |
st.push(new IpLevelNode(removeLastPart(node1.predecessor) + newNumber, node1.level+1, node1.successor)); | |
} | |
else { | |
st.push(new IpLevelNode(newNumber, node1.level+1, node1.successor)); | |
} | |
System.out.println("addp2:" + st.peek().predecessor + "," + st.peek().successor + " Level " + st.peek().level); | |
} | |
} | |
private static String getLastPart(String str) { | |
int lastIndex = str.lastIndexOf("."); | |
if (lastIndex > -1) { | |
return str.substring(lastIndex + 1); | |
} | |
return str; | |
} | |
private static String removeLastPart(String str) { | |
int lastIndex = str.lastIndexOf("."); | |
if(lastIndex == -1) { | |
return str; | |
} | |
StringBuilder sb = new StringBuilder(); | |
for(int i=0;i <lastIndex; ++i) { | |
sb.append(str.charAt(i)); | |
} | |
return sb.toString()+"."; | |
} | |
static class IpLevelNode { | |
String predecessor; | |
int level; | |
String successor; | |
public IpLevelNode(String p, int l, String s) { | |
this.predecessor = p; | |
this.level = l; | |
this.successor = s; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment