ที่นี่เราจะเห็นปัญหาอื่น โดยที่สตริงหนึ่งและค่าจำนวนเต็มอีกตัวหนึ่งระบุว่า k ถูกกำหนด เราต้องหาจำนวนสตริงย่อยที่มีความยาว k ซึ่งผลรวมของค่า ASCII ของอักขระหารด้วย k ลงตัว
สมมติว่าสตริงคือ “BCGABC” และค่าของ k คือ 3 ในที่นี้สตริง BCG มีผลรวม ASCII 300, ABC มีผลรวม ASCII 294 ทั้งคู่หารด้วย k =3 ลงตัว
วิธีการนั้นง่าย ขั้นแรกเราต้องหาค่า ASCII ของอักขระของสตริงย่อยแรกที่มีความยาว k เราต้องใช้เทคนิคหน้าต่างบานเลื่อนและลบ ASCII ของอักขระตัวแรกของหน้าต่าง และเพิ่ม ASCII ของอักขระถัดไปซึ่งมาหลังจากเลื่อนหน้าต่าง เราจะเพิ่มจำนวนในแต่ละขั้นตอน เมื่อผลรวมหารด้วย k ลงตัว .
ตัวอย่าง
#include <iostream> using namespace std; int countKLenSubstr(string str, int k) { int len = str.length(); int sum = 0; int count = 0 ; for (int i = 0; i <len; i++) sum += str[i] ; //ASCII sum of first substring if (sum % k == 0) count++; for (int i = k; i < len; i++) { int prev_ascii = str[i-k]; //ASCII of the first character of the window sum -= prev_ascii; sum += str[i]; if (sum % k == 0) count += 1; } return count ; } int main() { string s = "BCGABC" ; int k = 3 ; cout<<"Number of substrings: " << countKLenSubstr(s, k); }
ผลลัพธ์
Number of substrings: 2