双指针算法

Posted lixyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双指针算法相关的知识,希望对你有一定的参考价值。

双指针算法

LeetCode 3. 无重复字符的最长子串

while()是非法的,在外更新答案

class Solution {
    public int lengthOfLongestSubstring(String s) {
        char[] c = s.toCharArray();
        int n = c.length;
        int[] cnt = new int[128];
        int res = 0;
        for(int i=0, j=0; j < n; j++) {
            cnt[c[j]]++;
            while(i <= j && cnt[c[j]] > 1) cnt[c[i++]]--;
            res = Math.max(res, j-i+1);
        }
        return res;
    }
}

LeetCode 76. 最小覆盖子串

注意while()中是合法,在此更新答案。

class Solution {
    boolean isEq(int[] cnt1, int[] cnt2) {
        for(int i=0; i < 128; i++) 
            if(cnt2[i] != 0 && cnt2[i] > cnt1[i])
                return false;
        return true;
    }
    public String minWindow(String s, String t) {
        if(t.equals("")) return "";
        char[] s1 = s.toCharArray();
        char[] t1 = t.toCharArray();
        int n = s1.length, m = t1.length;
        int[] cnt1 = new int[128];
        int[] cnt2 = new int[128];
        for(int i=0; i < m; i++) cnt2[t1[i]] ++;
        String res = "";
        for(int i=0, j=0; j < n; j++) {
            cnt1[s1[j]]++;
            while(i <= j && isEq(cnt1, cnt2)) {
                //System.out.println(i+","+j);
                if((res.equals("") || res.length() > j-i+1)) 
                    res = s.substring(i, j+1);
                cnt1[s1[i++]]--;
            }
        }
        return res;
    }
}

以上是关于双指针算法的主要内容,如果未能解决你的问题,请参考以下文章

双指针算法

算法双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )

双指针

算法快速排序

算法归并排序

LeetCode 20天算法刷题计划第三天:双指针