# LeetCode算法学习之- 滑动窗口-[1208. 尽可能使字符串相等]

189 阅读1分钟

题目

给你两个长度相同的字符串,s 和 t。

将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。

用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。

如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。

如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。

分析

\1. 子字符串的最大长度=》 滑动窗口

\2. 差值绝对值 =》 Math.abs(s[i].charCodeAt()-t[i].charCodeAt())

解法:滑动窗口


思想
1. 子字符串 =》 动态滑动窗口
2. 最大值 =》 max 不断的更新
3. 开销不超过 maxCount => 当超过时候 left++ 左边收敛
*/
// @lc code=start
/**
 * @param {string} s
 * @param {string} t
 * @param {number} maxCost
 * @return {number}
 */
var equalSubstring = function (s, t, maxCost) {
    //初始化值
  let max = 0;
  let sum = 0;
//   左指针
  let j = 0;
  for (let i = 0; i < s.length; i++) {
    //   累计开销
    sum += Math.abs(s[i].charCodeAt() - t[i].charCodeAt());
    // 当开销超过maxCost的时候 收敛左边界
    while (sum > maxCost && j <= i) {
      sum -= Math.abs(s[j].charCodeAt() - t[j].charCodeAt());
      j++;
    }
    // 不断更新max的值
    max = Math.max(max, i - j + 1);
  }
  return max 
};

//时间复杂度:O(n)
//空间复杂度:O(1)

总结

今天这道题是主要是练习如何使用 动态的滑动窗口 来求最大连续子字符串的题目

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com

\