package com.java.ly2011.Semptember;
/**
* 最短子串
* 串src中,包含串dest的 最短
* @author Acer
*
*/
public class MinSubStr {
public static void main(String[] args) {
char[] src = new char[]{'a','d','b','c','d','a','c','b','d','c','d','a'};
char[] dest = new char[]{'a','b','c'};
getMinSubStr(src, dest);
}
/**
* 复杂度的话应该是O(n*k) n src的长度 k是dest的长度
* 因为n应该远远大于k 所以应该可以算做O(n)
* @param src
* @param dest
*/
public static void getMinSubStr(char[] src, char[] dest){
int[] num = new int[26];
int resultA=0;
int resultB=src.length-1;
int begin =-1;
for(int end = 0; end< src.length ;end++ ){
num[src[end]-'a']+=1;
if(findAll(num, dest)){
while(findAll(num, dest)){
begin++;
num[src[begin]-'a']-=1;
}
//begin指向的字符不能再被去掉,begin就是子串开始的地方
//此时begin就是一个子串的开始位置 ,end就是该子串的结尾位置,然后判断是否比当前最短的还短
if((end-begin)<(resultB-resultA)){//比当前最短的还短
resultA = begin;
resultB = end;
}
}
}
for(int i = resultA ; i<=resultB;i++)
System.out.print(src[i]);
}
/**
* 检查待查字符对应的num数组中位置是否都不为0,有为0的返回false,意义为没有全部找到
* @param num
* @param dest
* @return
*/
public static boolean findAll(int[] num , char[] dest){
for(int i =0 ;i<dest.length;i++){
if(num[dest[i]-'a']==0)
return false;
}
return true;
}
}