程序员代码面试指南刷题--第五章.最短包含字符串的长度

题目描述
给定字符串str1和str2,求str1的字串中含有str2所有字符的最小字符串长度。
输入描述:

输入包括两行,第一行一个字符串,代表str1,第二行也是一个字符串,代表str2。

输出描述:

输出str1的字串中含有str2所有字符的最小字符串长度,如果不存在请输出0。

示例1

输入

abcde
ac

输出

3

说明

“abc”中包含“ac”,且“abc”是所有满足条件中最小的。

示例2

输入

12345
344

输出

0

解法一:利用哈希表

import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args)throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s1 = br.readLine();
        String s2 = br.readLine();
        int res = getRes(s1,s2);
        System.out.println(res);
    }
    public static int getRes(String s1,String s2){
        if(s1==null&&s2==null) return 0;
        if(s1==null||s2==null) return 0;
        if(s1.length()==0||s2.length()==0||s1.length()<s2.length()) return 0;
        char[] arr = s1.toCharArray();
        char[] p = s2.toCharArray();
        int[] map = new int[256];
        for(int i=0;i<p.length;i++){
            map[p[i]]++;            
        }
        int left = 0;
        int right = 0;
        int minLen = Integer.MAX_VALUE;
        int match = p.length;
        while(right!=arr.length){
            map[arr[right]]--;
            if(map[arr[right]]>=0){
                match--;
            }
            if(match==0){
                while(map[arr[left]]<0){
                    map[arr[left]]++;
                    left++;
                }
                minLen = Math.min(right-left+1,minLen);
                match++;
                map[arr[left++]]++;
            }
            right++;
        }
        return minLen==Integer.MAX_VALUE?0:minLen;
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值