基本原理
双指针,在左右两个边界处分别设有指针,一般可用于数组和字符串的应用,且优点遍历次数较少。
用双指针来限定窗口的范围,每一次对与指针进行滑动,来对于窗口里的数据结合判断。
例题
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。(力扣424题)
分析:对于此问题,可以用双指针限定窗口,再寻找窗口里的最多字符,
来遍历窗口寻找非该字符的其他字符出现的次数,与K值进行比较。
首先,尾指针右移,窗口长度加一,如果满足条件,则继续执行,否则头指针右移,窗口长度减一,对比即窗口整体右移。
int max(int *a,int left,int right) //函数找该窗口非最多字符出现次数
{
int t=0,x=0;
for(int i=0;i<26;i++)
{
if(a[i]>t)
t=a[i];
}
return right-left-t;
}
int characterReplacement(char* s, int k)
{
if(*s==0)
return 0;
int a[26]={
0};
int n = strlen(s);
int t=0;
int left = 0, right = 0;
a[s[0]-'A']++;
while (right < n)
{
right++; //窗口扩大,右指针右移
a[s[right] - 'A']++;
if (max(a,left,right) > k)
{
a[s[left] - 'A']--; //窗口缩小,左指针左移
left++;
}
if(t<(right-left))
t=right-left;
}
return t;
}