สมมติว่าเราให้สตริง s ที่ประกอบด้วยอักขระ a, b และ c เท่านั้น เราต้องคืนค่าจำนวนสตริงย่อยที่มีอักขระ a, b และ c ทั้งหมดเกิดขึ้นอย่างน้อยหนึ่งครั้ง ตัวอย่างเช่น หากสตริงคือ "abcabc" ผลลัพธ์จะเป็น 10 เนื่องจากสตริงย่อยที่มีอักขระ a, b และ c เกิดขึ้นอย่างน้อยหนึ่งตัว ได้แก่ "abc", "abca", "abcab", “abcabc”, “bca”, “bcab”, “cab”, “cabc” และ “abc” (อีกครั้งสำหรับส่วนสุดท้าย)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ret :=0 สร้างแผนที่ชื่อ m ตั้งค่า j :=0
-
สำหรับฉันอยู่ในช่วง 0 ถึงขนาดของ s
-
เพิ่มจำนวน s[i] ในแผนที่ m
-
ในขณะที่ m['a']> 0 และ m['b']> 0 และ m['c']> 0
-
ลดจำนวน s[i] ในแผนที่ m
-
เพิ่มขึ้น 1
-
-
เพิ่ม ret โดย j
-
-
รีเทิร์น
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int numberOfSubstrings(string s) {
int ret = 0;
map <char, int> m;
int j = 0;
for(int i = 0; i < s.size(); i++){
m[s[i]]++;
while(m['a'] > 0 && m['b'] > 0 && m['c'] > 0){
m[s[j]]--;
j++;
}
ret += j;
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.numberOfSubstrings("abcabc"));
} อินพุต
"abcabc"
ผลลัพธ์
10