题目链接:3090. 每个字符最多出现两次的最长子字符串(简单)
算法原理:
解法:(越短越合法/求最长/最大)滑动窗口
击败100.00%
时间复杂度O(N)
本质与优选算法-滑动窗口:10.无重复字符的最长字串一样,只是把可重复元素从1变成了2
由于字符串中只有26个字母,所以可以用数组模拟哈希表来提高效率
1️⃣进窗口:遍历字符串每个元素
2️⃣出窗口:当哈希表中该元素出现次数>2时,左端点持续出窗口,直至该元素的次数==2
3️⃣更新:取最大值作为返回值
Java代码:
class Solution {
public int maximumLengthSubstring(String ss) {
//为了提高效率,这里用数组模拟哈希表
char[] s=ss.toCharArray();
int[] hash=new int[26];
int n=s.length,left=0,ret=0;
for(int right=0;right<n;right++){
//进窗口
int in=s[right]-'a';
hash[in]++;
//出窗口
while(hash[in]>2){
int out=s[left]-'a';//注意out要定义在循环里,方便更新
hash[out]--;
left++;
}
//更新
ret=Math.max(ret,right-left+1);
}
return ret;
}
}
898

被折叠的 条评论
为什么被折叠?



