字符串最短子串

 

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    
   if(num[dest[i]-'a']==0)
    return false;
   
  }
  
  return true;
  
  
 }
}

你可能感兴趣的:(字符串最短子串)