双指针算法
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;
}
}
以上是关于双指针算法的主要内容,如果未能解决你的问题,请参考以下文章