Created
November 15, 2012 16:22
-
-
Save yssharma/4079498 to your computer and use it in GitHub Desktop.
SubString using suffix array logic
This file contains hidden or 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
| /********************************************* | |
| My TestCases: | |
| 2 | |
| aab | |
| aac | |
| 3 | |
| 3 | |
| 7 | |
| 23 | |
| ---------- | |
| 6 | |
| banana | |
| anaconda | |
| anamoly | |
| band | |
| blue | |
| ugly | |
| 6 | |
| 37 | |
| 93 | |
| 25 | |
| 2 | |
| 50 | |
| 12 | |
| **********************************************/ | |
| package strings; | |
| import java.util.ArrayList; | |
| import java.util.Collections; | |
| import java.util.Map; | |
| import java.util.Scanner; | |
| import java.util.TreeMap; | |
| public class Solution{ | |
| public static void solution1() | |
| { | |
| Scanner sc = new Scanner(System.in); | |
| int noOfStr = sc.nextInt(); | |
| /** Create suffix map instead of suffix array **/ | |
| Map<String,Integer> unionMap = new TreeMap<String, Integer>(); | |
| String input = null; | |
| String subStr=null; | |
| for (int i = 0; i < noOfStr; i++) { | |
| input = sc.next(); | |
| int len = input.length(); | |
| for (int start = 0; start < len; start++){ | |
| subStr = input.substring(start); | |
| unionMap.put(subStr,subStr.length()); | |
| } | |
| } | |
| /** Sort the suffixes **/ | |
| ArrayList<String> suffixArr = new ArrayList<String>(unionMap.keySet()); | |
| Collections.sort(suffixArr); | |
| int sufArrSize = suffixArr.size(); | |
| int substrSum[] = new int[sufArrSize]; | |
| int overlap = 0; | |
| String s1=null,s2=null; | |
| substrSum[0] = suffixArr.get(0).length(); | |
| int max = 0; | |
| for(int i=0; i<sufArrSize-1; i++){ | |
| overlap=0; | |
| s1=suffixArr.get(i); | |
| s2=suffixArr.get(i+1); | |
| for(int j=0; j<suffixArr.get(i).length(); j++){ | |
| if(s1.charAt(j)==s2.charAt(j)){ | |
| overlap++; | |
| } | |
| else | |
| break; | |
| } | |
| max= substrSum[i+1]= substrSum[i] + (s2.length()-overlap); | |
| } | |
| int noOfOutput = sc.nextInt(); | |
| /*for(int i=0; i<substrSum.length; i++) | |
| System.out.println(suffixArr.get(i)+"\t"+substrSum[i]); | |
| */ | |
| for (int i = 0; i < noOfOutput; i++) { | |
| int index = sc.nextInt(); | |
| if (index > max){ | |
| //System.out.println("index:"+index+",max:"+max); | |
| System.out.println("INVALID"); | |
| } | |
| else{ | |
| int ind = binSearch(substrSum, index, 0, sufArrSize-1); | |
| //System.out.println("index:"+index+",ind:"+ind+",val[ind]:"+substrSum[ind]); | |
| System.out.println(suffixArr.get(ind).substring(0, (suffixArr.get(ind).length()-(substrSum[ind] - index)))); | |
| } | |
| } | |
| } | |
| public static int binSearch(int[] in, int num, int low, int high){ | |
| if(low>high) | |
| return ((low+high)/2)+1; | |
| if(low==high) | |
| return low; | |
| int mid = (low+high)/2; | |
| if(in[mid]==num) | |
| return mid; | |
| else if(num > in[mid]) | |
| return binSearch(in, num, mid+1, high); | |
| else | |
| return binSearch(in, num, low, mid); | |
| } | |
| public static void main(String[] a) { | |
| Solution.solution1(); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment