部分文章内容为公开资料查询整理,原文出处可能未标注,如有侵权,请联系我,谢谢。邮箱地址:gnivor@163.com ►►►需要气球么?请点击我吧!

编程之美--3.5最短摘要的生成(未完成)

http://www.cnblogs.com/pangxiaodong/archive/2011/09/08/2171551.html

http://www.cnblogs.com/flyoung2008/archive/2012/04/08/2437489.html

 

leetcode 76  Minimum Window Substring

//同编程之美3.5 最短摘要的生成
public static String minWindow(String s, String t) {
    int len_s = s.length();
    int len_t = t.length();
    int minlen = Integer.MAX_VALUE; //最短长度
    int minstart  = Integer.MIN_VALUE;
    int minend = Integer.MIN_VALUE;
    int start=0 ; 
    int end=0;   
    
    HashMap<Character,Integer> map_t = new HashMap<Character,Integer>(); //用于保存t内的字符,方便以后查找
    HashMap<Character,Integer> map_tcount = new HashMap<Character,Integer>(); //用于保存t内的字符的具体数量
    for(int i = 0 ; i < len_t ; i++){
        map_t.put(t.charAt(i),0);
        Integer curr =map_tcount.get(t.charAt(i)) ; 
        if(curr==null){                
            map_tcount.put(t.charAt(i),1);                
        }
        else
            map_tcount.put(t.charAt(i),map_tcount.get(t.charAt(i))+1);
    }
    System.out.println(map_t);
    System.out.println(map_tcount);
    int tcount = 0;
    for(int i = 0 ; i < len_s ; i++){
        Integer currc = map_t.get(s.charAt(i));
        if(currc!=null){     //如果map内存在该字符,说明已经添加进去了
            if(tcount==0) start = minstart = i;
            if(currc<map_tcount.get(s.charAt(i)))
                tcount++;                            
            map_t.put(s.charAt(i),map_t.get(s.charAt(i))+1);        
        }
        if(tcount == len_t){ //已经找到一个集合
            end = minend = i; //指向结尾,(结尾包含在集合内)
            minlen = minend-minstart;
            break;
        }
    }            
    System.out.println("开始位置:"+minstart+" 结束位置:"+minend+" 长度:"+minlen+" 数量:"+tcount);    
    if(minlen==Integer.MAX_VALUE) return "";
    
    start = minstart ;
    while(start< len_s){
        System.out.println(map_t);
        char currchar = s.charAt(start);
        int cnum = map_t.get(currchar);
        if(cnum==1&&end==len_s-1) break;
        System.out.println("当前元素:"+currchar+" 剩余数量:"+cnum);
        if(cnum==map_tcount.get(currchar)){ //要除掉的字母在集合中只有一个了,需要从end开始向后找第一个与要除掉的字母相同的字母
            map_t.put(currchar,cnum-1);            
            for(int i = end+1 ; i < len_s ; i++){
                Integer currc = map_t.get(s.charAt(i)); //向后获取元素
                if(currc!=null){ //若当前元素是集合内的字母,需要更新字母的数量
                    map_t.put(s.charAt(i),    currc+1);
                }
                if(s.charAt(i)==currchar){//若当前字母为要寻找的字母,则可确定结尾位置
                    end = i; //更新结尾位置
                    break;
                }
            }                
            System.out.print("PART1:");                
        }
        else{ //要除掉的字母在集合中不止一个,从start开始向后找第一个与要除掉的字母相同的字母            
            map_t.put(currchar,cnum-1); //更新集合内相应字母的数量
                        System.out.print("PART2:");
        }

        //更新start位置
        for(int i = start+1 ; i < end ; i++){
            Integer currc = map_t.get(s.charAt(i)); //向后获取元素
            if(currc!=null){ //若当前元素是集合内的字母,需要更新起始位置
                start = i;
                break;
            }                    
        }        
        //如果数量不满足条件,则结束
        if(map_t.get(currchar)<map_tcount.get(currchar)){
            break;
        }  
        
        //两种情况都需要更新start的位置
        //第一种情况必然更新end位置
        //第二种不需要更新end            
        System.out.println("开始位置:"+start+" 结束位置:"+end+" 长度:"+(end-start));
        if(end-start<minlen){
            minlen =end-start;
            minstart = start ;
            minend = end;
        }        
        System.out.println("minstart: "+minstart+" minend:"+minend+" minlen:"+minlen);
    }
    return s.substring(minstart,minend+1);
}

 

posted @ 2015-06-28 16:10  流了个火  阅读(108)  评论(0)    收藏  举报
►►►需要气球么?请点击我吧!►►►
View My Stats