学习内容
1208.尽可能使字符串相等
我的代码
class Solution {
public int equalSubstring(String s, String t, int maxCost) {
int res=0;
int left=0;
int right;
int count=0;
for (right = 0; right < t.length(); right++) {
int def=calculateTheDifference(s.charAt(right),t.charAt(right));
maxCost-=def;
if(def<=maxCost){
count++;
}else{
if(count>res){
res=count;
}
count++;
while(maxCost<0){
maxCost+=calculateTheDifference(s.charAt(left),t.charAt(left));
left++;
count--;
}
}
}
if(count>res){
res=count;
}
return res;
}
int calculateTheDifference(int a,int b){
return Math.abs(a-b);
}
}
思路:
使用滑动窗口的思想,使用双指针的方法,右指针一查到底,左指针会当maxCount处于负数的时候,则将左指针向右移动,缩小窗口,直到MaxCount重新达到0以上(即合法).随后,当窗口再次合法后稳定了.计算窗口的大小,如果窗口的大小,超过了目前已知的最大的窗口大小,就刷新窗口的最大值.不要忘记,在最后尝试刷新一下最大窗口的大小.
优解大小
class Solution {
public int equalSubstring(String s, String t, int maxCost) {
int n = s.length();
int[] diff = new int[n];
for (int i = 0; i < n; i++) {
diff[i] = Math.abs(s.charAt(i) - t.charAt(i));
}
int maxLength = 0;
int start = 0, end = 0;
int sum = 0;
while (end < n) {
sum += diff[end];
while (sum > maxCost) {
sum -= diff[start];
start++;
}
maxLength = Math.max(maxLength, end - start + 1);
end++;
}
return maxLength;
}
}
心得
1.如果要计算的话,可以把循环里面的给拆开来,就比如这里的循环中每个位置都需要计算一下,可以用一个循环来单独计算一下.
2.在这个循环中省略了count的技术,减少了循环的计算.进而减少运算时间.
3.思路差不多,以这个为主.