假定字符串
s
s
s 和
t
t
t 的长度均为
n
n
n,对于任意
0
≤
i
<
n
0≤i
,因此可以创建一个长度为
n
n
n 的数组
d
i
f
f
diff
diff,其中
d
i
f
f
[
i
]
=
∣
s
[
i
]
−
t
[
i
]
∣
diff[i]= |s[i]−t[i]|
diff[i]=∣s[i]−t[i]∣。
创建数组
d
i
f
f
diff
diff 之后,问题转化成计算数组
d
i
f
f
diff
diff 的元素和不超过
m
a
x
C
o
s
t
maxCost
maxCost 的最长子数组的长度。
由于
d
i
f
f
diff
diff 的的每个元素都是非负的,因此可以用滑动窗口的方法得到符合要求的最长子数组的长度。
滑动窗口的思想是,维护两个指针
s
t
a
r
t
start
start 和
e
n
d
end
end 表示数组
d
i
f
f
diff
diff 的子数组的开始下标和结束下标,满足子数组的元素和不超过
m
a
x
C
o
s
t
maxCost
maxCost,子数组的长度是
e
n
d
−
s
t
a
r
t
+
1
end−start+1
end−start+1。初始时,
s
t
a
r
t
start
start 和
e
n
d
end
end 的值都是
0
0
0。
另外还要维护子数组的元素和
s
u
m
sum
sum,初始值为
0
0
0。在移动两个指针的过程中,更新
s
u
m
sum
sum 的值,判断子数组的元素和是否大于
m
a
x
C
o
s
t
maxCost
maxCost,并决定应该如何移动指针。
为了得到符合要求的最长子数组的长度,应遵循以下两点原则:
基于上述原则,滑动窗口的做法如下:
遍历结束之后,即可得到符合要求的最长子数组的长度,即字符串可以转化的最大长度。
class Solution {
public:
int equalSubstring(string s, string t, int maxCost) {
int n=s.length();
vector<int> diff(n,0);
for(int i=0;i<n;i++)
diff[i]=abs(s[i]-t[i]);
int res=-1,sum=0;
int start=0,end=0;
while(end<n)
{
sum+=diff[end];
while(sum>maxCost)
{
sum-=diff[start];
start++;
}
res=max(res,end-start+1);
end++;
}
return res;
}
};