题目
给你两个长度相同的字符串,s 和 t。
将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。
用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。
如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。
如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。
示例 1:
输入:s = “abcd”, t = “bcdf”, cost = 3
输出:3
解释:s 中的 “abc” 可以变为 “bcd”。开销为 3,所以最大长度为 3。
示例 2:
输入:s = “abcd”, t = “cdef”, cost = 3
输出:1
解释:s 中的任一字符要想变成 t 中对应的字符,其开销都是 2。因此,最大长度为 1。
示例 3:
输入:s = “abcd”, t = “acde”, cost = 0
输出:1
解释:你无法作出任何改动,所以最大长度为 1。
提示:
1 <= s.length, t.length <= 10^5
0 <= maxCost <= 10^6
s 和 t 都只含小写英文字母。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/get-equal-substrings-within-budget
模板:
int equalSubstring(char * s, char * t, int maxCost){
}
先看模板内变量
s t 就是两个转换前后的字符数组
maxcost就是最大转化预算
整个执行流程如下:
int equalSubstring(char* s, char* t, int maxCost) {
int n = strlen(s);//获取字符串s的长度
int diff[n];//建立长度与s字符串长度一致的整型数组diff
memset(diff, 0, sizeof(diff));//将diff用0注满
for (int i = 0; i < n; i++) {
diff[i] = fabs(s[i] - t[i]);//将第i个元素转化所需的开销存入diff的第i个位置
}
int maxLength = 0;
int start = 0, end = 0;
int sum = 0;
while (end < n) {//当终点指针仍在diff长度范围内
sum += diff[end];//将此时end所在的元素的所需的开销加到总计数里
while (sum > maxCost) {//若此时总开销超出开销限制执行
sum -= diff[start];//从总开销中移除start所指的开销
start++;//start指针后移
}
maxLength = fmax(maxLength, end - start + 1);//最大长度获取更新
end++;//end指针位置后移
}
return maxLength;
}
以上就是官方代码的思路了,不过对于一些基础函数的引用还是很多的比如:
mmset();fabs();fmax();
以及讲讲我的个人理解:
此处所用的是两个while循环,做出如下操作:
1.从第一个元素开始作为start,进行最大开销所能转换到的单位作为end,此阶段会不断更新最大转化长度;
2.当第一个元素作为start和已知end的所需开销已经超出预期开销,就将start移位到第二个元素位置,继续执行end位移;
3.循环往复就会使得该数组内的最大课转化长度得到并返回。
注意:对于所有的元素并不需要解析所有的子集数组,因为我们所需要求的是最长可转化的数组长度,在每次得到新的长度之后就不再考虑后面比当前长度更低的子数组了。