题目
给你两个长度相同的字符串,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
\