Atsižvelgiant į eilutes, susidedančias iš tik mažųjų angliškų raidžių, ir sveikasis skaičius k suskaičiuoja bendrą S substringų skaičių (nebūtinai skirtingą), kuriuose yra tiksliai k atskiri simboliai.
Pastaba:
- Substringas yra gretimas simbolių seka eilutėje.
- Straipsniai, kurie yra identiški, bet pasireiškia skirtingose padėtyse, turėtų būti suskaičiuoti atskirai.
Pavyzdžiai:
Parsisiųsti youtube vaizdo įrašą su vlc
Įvestis: s = 'abc' k = 2
Išvestis: 2
Paaiškinimas: Galimi substringai yra ['ab' 'bc']Įvestis: s = 'aba' k = 2
Išvestis: 3
Paaiškinimas: Galimi substringai yra ['ab' 'ba' 'aba']Įvestis: s = 'aa' k = 1
Išvestis: 3
Paaiškinimas: Galimi substringai yra ['a' 'a' 'aa']
skirtumas tarp lapės ir vilko
Turinio lentelė
- [Naivus požiūris] Tikrina visus substrinius - o (n^2) Laikas ir O (1) erdvė
- [Efektyvus požiūris] Naudojant stumdymo lango metodą - O (n) Laikas ir O (1) erdvė
[Naivus požiūris] Tikrina visus substrinius - o (n^2) Laikas ir O (1) erdvė
C++Idėja yra patikrinti kiekvieną įmanomą substringą, pakartojant visas įmanomas pradines pozicijas (i) ir eilutėje (j) pabaigos pozicijas. Kiekvienam poskyriui išlaikykite loginį masyvą, kad galėtumėte sekti atskirus simbolius ir skaitiklį, skirtą atskirų simbolių skaičiui. Išplečiant substringą iš kairės į dešinę, jis atnaujina skirtingą simbolių skaičių, patikrindamas, ar kiekvienas naujas simbolis buvo matomas anksčiau. Kai tik atskirų simbolių skaičius tiksliai atitinka duotą k, jis padidina atsakymų skaičių.
#include #include using namespace std; int countSubstr(string &s int k) { int n = s.length(); int ans = 0; for (int i=0; i<n; i++) { // array to check if a character // is present in substring i..j vector<bool> map(26 0); int distinctCnt = 0; for (int j=i; j<n; j++) { // if new character is present // increment distinct count. if (map[s[j] - 'a'] == false) { map[s[j] - 'a'] = true; distinctCnt++; } // if distinct count is equal to k. if (distinctCnt == k) ans++; } } return ans; } int main() { string s = 'abc'; int k = 2; cout << countSubstr(s k); return 0; }
Java class GfG { static int countSubstr(String s int k) { int n = s.length(); int ans = 0; for (int i = 0; i < n; i++) { // array to check if a character // is present in substring i..j boolean[] map = new boolean[26]; int distinctCnt = 0; for (int j = i; j < n; j++) { // if new character is present // increment distinct count. if (!map[s.charAt(j) - 'a']) { map[s.charAt(j) - 'a'] = true; distinctCnt++; } // if distinct count is equal to k. if (distinctCnt == k) ans++; } } return ans; } public static void main(String[] args) { String s = 'abc'; int k = 2; System.out.println(countSubstr(s k)); } }
Python def countSubstr(s k): n = len(s) ans = 0 for i in range(n): # array to check if a character # is present in substring i..j map = [False] * 26 distinctCnt = 0 for j in range(i n): # if new character is present # increment distinct count. if not map[ord(s[j]) - ord('a')]: map[ord(s[j]) - ord('a')] = True distinctCnt += 1 # if distinct count is equal to k. if distinctCnt == k: ans += 1 return ans if __name__ == '__main__': s = 'abc' k = 2 print(countSubstr(s k))
C# using System; class GfG { static int countSubstr(string s int k) { int n = s.Length; int ans = 0; for (int i = 0; i < n; i++) { // array to check if a character // is present in substring i..j bool[] map = new bool[26]; int distinctCnt = 0; for (int j = i; j < n; j++) { // if new character is present // increment distinct count. if (!map[s[j] - 'a']) { map[s[j] - 'a'] = true; distinctCnt++; } // if distinct count is equal to k. if (distinctCnt == k) ans++; } } return ans; } static void Main() { string s = 'abc'; int k = 2; Console.WriteLine(countSubstr(s k)); } }
JavaScript function countSubstr(s k) { let n = s.length; let ans = 0; for (let i = 0; i < n; i++) { // array to check if a character // is present in substring i..j let map = new Array(26).fill(false); let distinctCnt = 0; for (let j = i; j < n; j++) { // if new character is present // increment distinct count. if (!map[s.charCodeAt(j) - 'a'.charCodeAt(0)]) { map[s.charCodeAt(j) - 'a'.charCodeAt(0)] = true; distinctCnt++; } // if distinct count is equal to k. if (distinctCnt === k) ans++; } } return ans; } // Driver Code let s = 'abc'; let k = 2; console.log(countSubstr(s k));
Išvestis
2
[Efektyvus požiūris] Naudojant stumdymo lango metodą - O (n) Laikas ir O (1) erdvė
Idėja yra naudoti stumdomas langas Technika, leidžianti efektyviai suskaičiuoti substrinius daugiausia k skirtingų simbolių ir atimti substringų skaičių su daugiausia K-1 skirtingų simbolių, kad būtų gautas substrinių skaičius su tiksliai K skirtingais simboliais.
Žingsnis po žingsnio įgyvendinimas:
- Norėdami sekti simbolių dažnius, naudokite stumdomą langą su 26 dydžio masyvu.
- Išskleiskite langą į dešinę pridedant simbolių.
- Susitraukite langą iš kairės, kai skirtingi simboliai viršija k.
- Suskaitykite visus galiojančius poskyrius lange.
- Atimkite posts su K-1 skirtingais simboliais nuo K skirtingų simbolių.
#include #include using namespace std; // function which finds the number of // substrings with atmost k Distinct // characters. int count(string &s int k) { int n = s.length(); int ans = 0; // use sliding window technique vector<int> freq(26 0); int distinctCnt = 0; int i = 0; for (int j = 0; j < n; j++) { // expand window and add character freq[s[j] - 'a']++; if (freq[s[j] - 'a'] == 1) distinctCnt++; // shrink window if distinct characters exceed k while (distinctCnt > k) { freq[s[i] - 'a']--; if (freq[s[i] - 'a'] == 0) distinctCnt--; i++; } // add number of valid substrings ending at j ans += j - i + 1; } return ans; } // function to find the number of substrings // with exactly k Distinct characters. int countSubstr(string &s int k) { int n = s.length(); int ans = 0; // subtract substrings with at most // k-1 distinct characters from substrings // with at most k distinct characters ans = count(s k) - count(s k-1); return ans; } int main() { string s = 'abc'; int k = 2; cout << countSubstr(s k); return 0; }
Java class GfG { // function which finds the number of // substrings with atmost k Distinct // characters. static int count(String s int k) { int n = s.length(); int ans = 0; // use sliding window technique int[] freq = new int[26]; int distinctCnt = 0; int i = 0; for (int j = 0; j < n; j++) { // expand window and add character freq[s.charAt(j) - 'a']++; if (freq[s.charAt(j) - 'a'] == 1) distinctCnt++; // shrink window if distinct characters exceed k while (distinctCnt > k) { freq[s.charAt(i) - 'a']--; if (freq[s.charAt(i) - 'a'] == 0) distinctCnt--; i++; } // add number of valid substrings ending at j ans += j - i + 1; } return ans; } // function to find the number of substrings // with exactly k Distinct characters. static int countSubstr(String s int k) { int n = s.length(); int ans = 0; // Subtract substrings with at most // k-1 distinct characters from substrings // with at most k distinct characters ans = count(s k) - count(s k - 1); return ans; } public static void main(String[] args) { String s = 'abc'; int k = 2; System.out.println(countSubstr(s k)); } }
Python # function which finds the number of # substrings with atmost k Distinct # characters. def count(s k): n = len(s) ans = 0 # ese sliding window technique freq = [0] * 26 distinctCnt = 0 i = 0 for j in range(n): # expand window and add character freq[ord(s[j]) - ord('a')] += 1 if freq[ord(s[j]) - ord('a')] == 1: distinctCnt += 1 # shrink window if distinct characters exceed k while distinctCnt > k: freq[ord(s[i]) - ord('a')] -= 1 if freq[ord(s[i]) - ord('a')] == 0: distinctCnt -= 1 i += 1 # add number of valid substrings ending at j ans += j - i + 1 return ans # function to find the number of substrings # with exactly k Distinct characters. def countSubstr(s k): n = len(s) ans = 0 # subtract substrings with at most # k-1 distinct characters from substrings # with at most k distinct characters ans = count(s k) - count(s k - 1) return ans if __name__ == '__main__': s = 'abc' k = 2 print(countSubstr(s k))
C# using System; class GfG { // function which finds the number of // substrings with atmost k Distinct // characters. static int count(string s int k) { int n = s.Length; int ans = 0; // use sliding window technique int[] freq = new int[26]; int distinctCnt = 0; int i = 0; for (int j = 0; j < n; j++) { // expand window and add character freq[s[j] - 'a']++; if (freq[s[j] - 'a'] == 1) distinctCnt++; // shrink window if distinct characters exceed k while (distinctCnt > k) { freq[s[i] - 'a']--; if (freq[s[i] - 'a'] == 0) distinctCnt--; i++; } // add number of valid substrings ending at j ans += j - i + 1; } return ans; } // function to find the number of substrings // with exactly k Distinct characters. static int countSubstr(string s int k) { int n = s.Length; int ans = 0; // subtract substrings with at most // k-1 distinct characters from substrings // with at most k distinct characters ans = count(s k) - count(s k - 1); return ans; } static void Main() { string s = 'abc'; int k = 2; Console.WriteLine(countSubstr(s k)); } }
JavaScript // function which finds the number of // substrings with atmost k Distinct // characters. function count(s k) { let n = s.length; let ans = 0; // use sliding window technique let freq = new Array(26).fill(0); let distinctCnt = 0; let i = 0; for (let j = 0; j < n; j++) { // expand window and add character freq[s.charCodeAt(j) - 'a'.charCodeAt(0)]++; if (freq[s.charCodeAt(j) - 'a'.charCodeAt(0)] === 1) distinctCnt++; // shrink window if distinct characters exceed k while (distinctCnt > k) { freq[s.charCodeAt(i) - 'a'.charCodeAt(0)]--; if (freq[s.charCodeAt(i) - 'a'.charCodeAt(0)] === 0) distinctCnt--; i++; } // add number of valid substrings ending at j ans += j - i + 1; } return ans; } // sunction to find the number of substrings // with exactly k Distinct characters. function countSubstr(s k) { let n = s.length; let ans = 0; // subtract substrings with at most // k-1 distinct characters from substrings // with at most k distinct characters ans = count(s k) - count(s k - 1); return ans; } // Driver Code let s = 'abc'; let k = 2; console.log(countSubstr(s k));
Išvestis
2