Amazon Interview Question
Software Engineer / DevelopersCountry: United States
Interview Type: Phone Interview
/*
* Slight modification of KMP string searching algorithm
* Time complexity is O(m+n)
* This algorithm takes atmost 2n comparisons
*/
public int[ ] preProcessPattern(char[ ] ptrn) {
int i = 0, j = -1;
int ptrnLen = ptrn.length;
int[] b = new int[ptrnLen + 1];
b[i] = j;
while (i < ptrnLen) {
if(ptrn[i] == '\\' ){ // Ignore \d+ or \d*
i += 3;
}
while (j >= 0 && ptrn[i] != ptrn[j]) {
// if there is mismatch consider next widest border
j = b[j];
}
i++;
j++;
b[i] = j;
}
return b;
}
public boolean searchSubString(char[ ] text, char[ ] ptrn) {
int i = 0, j = 0;
// pattern and text lengths
int ptrnLen = ptrn.length;
int txtLen = text.length;
// initialize new array and preprocess the pattern
int[ ] b = preProcessPattern(ptrn);
while (i < txtLen) {
if(Character.isDigit(text[i])){
if(isMultipleDigit(ptrn, j)){
j+=3;
while(i < txtLen && Character.isDigit(text[i])){
i++;
}
}
if(isSingleDigit(ptrn, j)){
j+=3;
i++;
}
}
while (j >= 0 && text[i] != ptrn[j]) {
j = b[j];
}
i++;
j++;
// a match is found
if (j == ptrnLen) {
return true;
}
}
return false;
}
public boolean isMultipleDigit(char [ ]ptrn, int index){
boolean isMultipleDigit = false;
if(ptrn[index]== '\\' && ptrn[index+1]== 'd' && ptrn[index+2]== '*'){
isMultipleDigit = true;
}
return isMultipleDigit;
}
public boolean isSingleDigit(char [ ]ptrn, int index){
boolean isSingleDigit = false;
if(ptrn[index]== '\\' && ptrn[index+1]== 'd' && ptrn[index+2]== '+'){
isSingleDigit = true;
}
return isSingleDigit;
}
public static void main(String[] args) {
StringSearchingHavingRegexPattern stm = new StringSearchingHavingRegexPattern();
System.out.println(stm.searchSubString("abcd123456abcd".toCharArray(), "abcd\\d*abcd".toCharArray()));
System.out.println(stm.searchSubString("abcd12abcd".toCharArray(), "abc,d\\d*abcd".toCharArray()));
System.out.println(stm.searchSubString("abcd1abcd".toCharArray(), "abcd\\d*abcd".toCharArray()));
System.out.println(stm.searchSubString("abcd123456bcd".toCharArray(), "abcd\\d*abcd".toCharArray()));
System.out.println(stm.searchSubString("abcd1abcd".toCharArray(), "abcd\\d+abcd".toCharArray()));
System.out.println(stm.searchSubString("abcd2abcd".toCharArray(), "abcd\\d+abcd".toCharArray()));
System.out.println(stm.searchSubString("abcd7abcd".toCharArray(), "abcd\\d+abcd".toCharArray()));
System.out.println(stm.searchSubString("abcd123456abcd".toCharArray(), "abcd\\d+abcd".toCharArray()));
}
- BVarghese July 29, 2013