Skip to content

Instantly share code, notes, and snippets.

@madhur
Last active July 13, 2019 17:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save madhur/099f69dbddc84824445cef126dc5bfd2 to your computer and use it in GitHub Desktop.
Save madhur/099f69dbddc84824445cef126dc5bfd2 to your computer and use it in GitHub Desktop.
IP Matching
// 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