ให้ String สองตัว s และ t ความยาวเท่ากัน เราต้องการเปลี่ยน s ให้กลายเป็น t โดยการเปลี่ยนตัวอักษรตำแหน่งที่ i จาก s[i] เป็น t[i] มี **ค่าใช้จ่าย (Cost)** เท่ากับ |s[i] - t[i]| (ค่าสัมบูรณ์ของความต่าง ASCII)
กำหนด maxCost เป็นงบประมาณสูงสุด หา **ความยาวสูงสุด (Maximum Length)** ของ Substring ที่สามารถเปลี่ยนได้ภายในงบประมาณนี้
ตัวอย่าง
s = "abcd", t = "bcdf", maxCost = 3
- Substring
"abc"ใน s ->"bcd"ใน t - Cost = |'a'-'b'| + |'b'-'c'| + |'c'-'d'| = 1+1+1 = 3
- คำตอบ = 3
อัลกอริทึม: Sliding Window (Two Pointers)
- ใช้ 2 Pointer:
j(Left),i(Right) ขยาย Window ไปทางขวา - เก็บ
sum= ค่าใช้จ่ายสะสมใน Window ปัจจุบัน - ถ้า
sum > maxCost-> หด Window ด้านซ้าย (j++) จนกว่าsum <= maxCost - อัปเดตคำตอบ
ret = max(ret, i - j + 1)ทุกขั้นตอน
ตัวอย่างโค้ด C++
class Solution {
public:
int equalSubstring(string s, string t, int maxCost) {
int j = 0; // Left pointer
int sum = 0; // Current cost
int ret = 0; // Max length found
for (int i = 0; i < min(s.size(), t.size()); i++) {
sum += abs(s[i] - t[i]); // Expand right
// Shrink left while over budget
while (sum > maxCost) {
sum -= abs(s[j] - t[j]);
j++;
}
ret = max(ret, i - j + 1); // Update answer
}
return ret;
}
};
Input / Output
Input: "abcd" "bcdf" 3 Output: 3
ความซับซ้อน (Complexity)
- Time: O(N) — แต่ละตัวอักษรถูกเพิ่ม/ลบจาก Window สูงสุด 1 ครั้ง
- Space: O(1) — ใช้ตัวแปรคงที่
เทคนิค Sliding Window เหมาะสำหรับโจทย์หา Subarray/Substring ที่สatisfy เงื่อนไขแบบ "ผลรวมไม่เกิน K" ครับ