package com.interview.books.ninechapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-12-12
* Time: 上午11:03
*/
public class NC4_WordPairMinDistance {
String[] article;
HashMap<String, List<Integer>> indexes;
public NC4_WordPairMinDistance(String[] article){
this.article = article;
indexes = new HashMap<>();
buildIndex();
}
private void buildIndex(){
for(int i = 0; i < article.length; i++){
List<Integer> offsets = indexes.get(article[i]);
if(offsets == null){
offsets = new ArrayList<>();
indexes.put(article[i], offsets);
}
offsets.add(i);
}
}
public int minDistance(String w1, String w2){
List<Integer> w1Idxs = indexes.get(w1);
List<Integer> w2Idxs = indexes.get(w2);
if(w1Idxs == null || w2Idxs == null) return Integer.MAX_VALUE;
int w1Idx = 0;
int w2Idx = 0;
int min = Integer.MAX_VALUE;
//Time: O(N)
while(w1Idx < w1Idxs.size() && w2Idx < w2Idxs.size()){
//move the index of W1 to the largest index which smaller than the index of W2.
while(w1Idx < w1Idxs.size() - 1 && w1Idxs.get(w1Idx + 1) < w1Idxs.get(w1Idx)) w1Idx++;
int distance = w2Idxs.get(w2Idx) - w1Idxs.get(w1Idx) - 1;
if(distance >= 0) {
min = Math.min(min, distance);
w1Idx++;
}
//move the index of W2 to the smallest index which larger than index of W1.
while(w2Idx < w2Idxs.size() && w1Idx < w1Idxs.size() && w2Idxs.get(w2Idx) < w1Idxs.get(w1Idx)) w2Idx++;
}
return min;
}
public static void main(String[] args){
String[] article = "ABBCCAABC".split("|");
NC4_WordPairMinDistance finder = new NC4_WordPairMinDistance(article);
System.out.println(finder.minDistance("A", "C"));
System.out.println(finder.minDistance("C", "A"));
System.out.println(finder.minDistance("B", "A"));
System.out.println(finder.minDistance("C", "B"));
}
}