import java.util.HashMap;
import java.util.Map.Entry;
//数组中两个字符串的最小距离
public class MinDistance{
//获得两个字符串的最短距离
public static int GetMinDistance(String[]strs,String str1,String str2)
{
if(str1==null||str2==null||strs==null)
{
return -1;
}
//模式串的值相同
if(str1.equals(str2))
{
return 0;
}
int last1=-1; //模式串1初始化
int last2=-1; //模式串2初始化
int min=Integer.MAX_VALUE;
for(int i=0;i!=strs.length;i++)
{
if(strs[i].equals(str1))
{
min=Math.min(min,last2==-1?min:i-last2);
last1=i;
}
if(strs[i].equals(str2))
{
min=Math.min(min,last1==-1?min:i-last1);
last2=i;
}
}
return min==Integer.MAX_VALUE?-1:min;
}
//查询多次的情况下时间复杂度降为O(1)(运用哈希表)
public static class Record {
private HashMap<String, HashMap<String, Integer>> record;
public Record(String[] strArr) {
record = new HashMap<String, HashMap<String, Integer>>();
HashMap<String, Integer> indexMap = new HashMap<String, Integer>();
for (int i = 0; i != strArr.length; i++) {
String curStr = strArr[i];
update(indexMap, curStr, i);
indexMap.put(curStr, i);
}
}
private void update(HashMap<String, Integer> indexMap, String str, int i) {
if (!record.containsKey(str)) {
record.put(str, new HashMap<String, Integer>());
}
HashMap<String, Integer> strMap = record.get(str);
for (Entry<String, Integer> lastEntry : indexMap.entrySet()) {
String key = lastEntry.getKey();
int index = lastEntry.getValue();
if (!key.equals(str)) {
HashMap<String, Integer> lastMap = record.get(key);
int curMin = i - index;
if (strMap.containsKey(key)) {
int preMin = strMap.get(key);
if (curMin < preMin) {
strMap.put(key, curMin);
lastMap.put(str, curMin);
}
} else {
strMap.put(key, curMin);
lastMap.put(str, curMin);
}
}
}
}
public int minDistance(String str1, String str2) {
if (str1 == null || str2 == null) {
return -1;
}
if (str1.equals(str2)) {
return 0;
}
if (record.containsKey(str1) && record.get(str1).containsKey(str2)) {
return record.get(str1).get(str2);
}
return -1;
}
}
public static void main(String[]args)
{
String[]strs={"1","3","3","3","2","3","1"};
String str1="1";
String str2="2";
System.out.println(GetMinDistance(strs,str1,str2));
System.out.println("============================");
Record record = new Record(strs);
System.out.println(record.minDistance("1", "3"));
System.out.println(record.minDistance("2", "3"));
System.out.println(record.minDistance("2", "1"));
}
}