最小包含子串的长度

//最小包含子串的长度
public class MinSubStringLen
{     
	//给定字符串str1和str2,求str1的子串中含有str2所有字符的最小子串长度)
      public static int GetMinLen(String str1,String str2)
      {
      	if(str1==null||str2==null||str1.length()<str2.length())
      	{
      		return 0;
      	}
        char[]ch1=str1.toCharArray();
        char[]ch2=str2.toCharArray();
        int[]map=new int[256];       //充当hash表
        for(int i=0;i<ch2.length;i++)
        {
        	map[ch2[i]]++;
        }
        int left=0;
        int right=0;  
        int match=ch2.length;
        int minlen=Integer.MAX_VALUE;  //匹配到的最短长度
        while(right<ch1.length)
        {
            map[ch1[right]]--;
            if(map[ch1[right]]>=0)
            {
            	match--;
            }
            //匹配到字符串str2
            if(match==0)
            {    
            	//匹配了多个
            	while(map[ch1[left]]<0)
            	{
            		map[ch1[left++]]++;
            	}
                minlen=Math.min(minlen,right-left+1);  //获得最短的长度
                match++;
                map[ch1[left++]]++; //str1收回str2匹配到的位置
            }
             right++;
        }

        return minlen==Integer.MAX_VALUE?0:minlen;
      }
	    
	  public static void main(String []args)
	  {
          String str1="abcde";
          String str2="ac";

          String str3="adabbca";
          String str4="acb";

          System.out.println(GetMinLen(str1,str2));
          System.out.println(GetMinLen(str3,str4));

	  }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值