寻找最小子字符串, 美团笔试题2020

双指针算法

import java.util.*;


public class Solution {
    /**
     * 
     * @param str1 string字符串 
     * @param str2 string字符串 
     * @return string字符串
     */
    public String getMinString (String str1, String str2) {
        if(str2.equals("")) return str1;
        int[] cnt1 = new int[128];
        int[] cnt2 = new int[128];
        char[] s1 = str1.toCharArray();
        char[] s2 = str2.toCharArray();
        int n = s1.length, m = s2.length;
        for(int i=0; i < n; i++)
            cnt1[s1[i]]++;
        for(int j=0; j < m; j++)
            cnt2[s2[j]]++;
        for(int i=0; i < 128; i++)
            if(cnt2[i] != 0 && cnt2[i] > cnt1[i]) {
                return "";
            }
        String res = str1;
        int left = 0, right = 0;
        for(int j=n-1; j >= 0; j--)
            if(--cnt1[s1[j]] < cnt2[s1[j]]){
                cnt1[s1[j]]++;
                right = j; break;
            }
        while(right < n) {
            while(cnt1[s1[left]] > cnt2[s1[left]]) 
                cnt1[s1[left++]]--;
            if(res.length() > right-left+1)
                res = str1.substring(left,right+1);
            right ++;
            while(right < n && s1[right] != s1[left])
                right++;
            left++;
        }
        return res;
    }
}
posted @ 2020-07-12 16:49  li修远  阅读(188)  评论(0编辑  收藏  举报