题解 | #最小覆盖子串#

最小覆盖子串

https://www.nowcoder.com/practice/c466d480d20c4c7c9d322d12ca7955ac

不会窗口滑动,我直接暴力拆解的,双指针+hashMap记事本

import java.util.*;


public class Solution {
    /**
     * 双指针 + 哈希
     * @param S string字符串
     * @param T string字符串
     * @return string字符串
     */
    public String minWindow (String S, String T) {
        String minStr = "";

        // 创建记事本并初始化
        HashMap<Character, Integer> book = new HashMap<>();
        initialBook(book, T);

        // 循环双指针遍历字符串S
        boolean flag = false;
        for(int i = 0, j = 0, k = 0; i <= S.length(); i++) {
            // 匹配到了一次
            if (j >= T.length()) {
                String matchStr = S.substring(k, i);
                if (minStr.isEmpty())
                    minStr = matchStr;
                else
                    minStr = matchStr.length() < minStr.length() ? matchStr : minStr;
                // 初始化i,j索引
                j = 0;
                i = k + 1;
                flag = false;
                // 初始化记事本
                initialBook(book, T);
            }
            if (i < S.length()) {
                char c = S.charAt(i);
                if (T.contains(String.valueOf(c)) && book.get(c) != 0) {
                    // 记录匹配字符串的开头索引
                    if (!flag) {
                        k = i;
                        flag = true;
                    }
                    book.put(c, book.get(c) - 1);
                    j++;
                }
            }
        }
        return minStr;
    }

     /**
     * 初始化记事本
     * @param book
     * @param T
     */
    public void initialBook(Map<Character, Integer> book, String T) {
        for (int i = 0; i < T.length(); i++) {
            book.put(T.charAt(i), book.getOrDefault(T.charAt(i), 0) + 1);
        }
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务