Count Vowel Strings in Ranges
Problem Statement
Aapko ek 0-indexed array of strings “words” aur ek 2D array of integers “queries” diye gaye hain.
Har query queries[i] = [li, ri] aapse puch rahi hai ke words ke range li se ri (dono inclusive) mein kitne strings hain jo vowel se start aur end hote hain.
Aapko ek array “ans” return karna hai jiska size ke barabar hoga, aur ans[i] mein ith query ka answer hoga.
Note: Vowel letters hain ‘a’, ‘e’, ‘i’, ‘o’, aur ‘u’.
Example 1:
Input: words = [“aba”,”bcb”,”ece”,”aa”,”e”], queries = [[0,2],[1,4],[1,1]] Output: [2,3,0]
Explanation:
Jo strings vowel se start aur end hoti hain wo hain “aba”, “ece”, “aa”, aur “e”.
[0,2] query ke liye answer hoga 2 (strings “aba” aur “ece”).
[1,4] query ke liye answer hoga 3 (strings “ece”, “aa”, “e”).
[1,1] query ke liye answer hoga 0.
Example 2: Input: words = [“a”,”e”,”i”], queries = [[0,2],[0,1],[2,2]] Output: [3,2,1]
Explanation:
Har string is condition ko satisfy karti hai, isiliye hum return karte hain [3,2,1].
Constraints:
1 <= <= 105
1 <= words[i].length <= 40
words[i] sirf lowercase English letters se bane hote hain.
sum(words[i].length) <= 3 * 105
1 <= <= 105
0 <= li <= ri <
Count Vowel Strings in Ranges
Vowel Strings Identify Karna: Sabse pehla step hai yeh dekhna ki kaunse strings vowel se start aur vowel pe end hote hain. Bas thoda focus zaroori hai.
Range Pr Queries Apply Karna: Queries aapko ek range deti hain (li to ri), aur aapko bas yeh count karna hai ki kitne strings us range mein hain, jo vowel se start aur end hote hain.
- Vowel Set Banana: Sab vowels ko ek set mein rakh lo - yeh help karega quick check karne mein ki koi character vowel hai ya nahi.
- Helper Function: Ek helper function likhna, jo check karega ki koi word vowel se start aur end hota hai ya nahi.
- Loop Thru Queries: Ab, har query ke liye iterate karke unhe range mein check karo.
- Count Ke Saath Update Karna: Har query ka count store karna hain jo ki find karega kitne vowel strings hain us range mein.Intuition
pehle aap vowels ko set mein store karte ho, phir har query ke liye range check karte ho ki kaunse strings vowel se start aur end hote hain, aur count ko result array mein store karte ho. Finally, result array ko return karte ho. Yeh approach simple, efficient, aur samajhne mein aasan hai.
Approach
Time Complexity:
Har Query Check Karna: Hum har query ko
queries
array ke through iterate karte hain. Agarq
queries hain, toh is part ki time complexity O(q) hogi.Range Mein Har Word Check Karna: Har query ke liye, hum
[li, ri]
range mein har word ko check karte hain. Jo zyada se zyada words hum check karna padega wohwords
array ki length hain, jon
hai. Worst case mein, hum sabn
words ko har query ke liye check kar sakte hain, jo time complexity O(n) per query banaata hai.Word Ko Vowel String Check Karna: Yeh check karna ki koi word vowel se start aur end hota hai, involves checking the first and last character, joh constant time O(1) mein hota hai.
Inhe combine karke, worst case scenario mein time complexity O(q * n) hogi, jahan q
number of queries hain aur n
number of words hain.
Space Complexity:
Results Array Ka Space: Hum har query ke results ko ek array
results
mein store karte hain, jiska length queries ke barabar hai, toh yeh part O(q) space use karta hai.Vowels Set Ka Space:
Vowels
set ek constant-sized set hai jo 5 characters contain karta hai, toh yeh part O(1) space use karta hai.Auxiliary Space Computations: Results aur vowels set ke alawa, algorithm ko significant additional space ki zaroorat nahi.
Isliye, overall space complexity O(q) hai.
Solution
function vowelStrings(words, queries) {
// Vowels ka ek set create karo
const vowels = new Set(['a', 'e', 'i', 'o', 'u']);
const results = [];
// Helper function jo check karega agar string vowel se start aur end hoti hai
function isVowelString(word) {
return vowels.has(word[0]) && vowels.has(word[word.length - 1]);
}
// Har query ke liye loop karo
for (const [li, ri] of queries) {
let count = 0;
// Range [li, ri] mein har word ko check karo
for (let i = li; i <= ri; i++) {
if (isVowelString(words[i])) count++;
}
results.push(count);
}
return results;
}
// Example 1
const words1 = ["aba", "bcb", "ece", "aa", "e"];
const queries1 = [[0, 2], [1, 4], [1, 1]];
console.log(vowelStrings(words1, queries1)); // Output: [2, 3, 0]
Steps:
Vowels Set Create Karna:
javascriptconst vowels = new Set(['a', 'e', 'i', 'o', 'u']);
Pehle, hum ek set banate hain jo sab vowels (a, e, i, o, u) ko contain karta hai. Is set se hum vowels ko quickly identify kar sakte hain.
Results Array Initialize Karna:
javascriptconst results = [];
Yeh array har query ke answers store karega.
Helper Function:
javascriptfunction isVowelString(word) { return vowels.has(word[0]) && vowels.has(word[word.length - 1]); } `` Helper function `isVowelString` banate hain jo check karta hai ki string vowel se start aur end hoti hai ya nahi.
Loop Through Queries:
javascriptfor (const [li, ri] of queries) {
Har query ko loop karte hain. Har query ek range [li, ri] contain karti hai.
Initialize Count:
javascriptlet count = 0;
Har query ke liye count variable initialize karte hain jo string count karega jo vowel se start aur end hoti hai.
Check Words in Range:
javascriptfor (let i = li; i <= ri; i++) { if (isVowelString(words[i])) count++; }
Range [li, ri] ke har word ko check karte hain ki kya wo vowel string hai. Agar haan, toh count increment karte hain.
Store Results:
javascriptresults.push(count);
Har query ka count results array mein store karte hain.
Return Results:
javascriptreturn results;
Akhri mein,
results
array ko return karte hain jo har query ka answer deta hai.
Solution
class Solution {
public:
vector vowelStrings(vector& words, vector>& queries) {
int n = words.size(); // Words ki length n store karo
vector v(n+1, 0); // Ek vector v banao jisme initial value 0 ho
// Har word ko check karo agar wo vowel se start aur end hota hai
for (int i = 0; i < n; i++) {
if ((words[i][0] == 'a' || words[i][0] == 'e' || words[i][0] == 'i' || words[i][0] == 'o' || words[i][0] == 'u') &&
(words[i][words[i].length() - 1] == 'a' || words[i][words[i].length() - 1] == 'e' || words[i][words[i].length() - 1] == 'i' || words[i][words[i].length() - 1] == 'o' || words[i][words[i].length() - 1] == 'u')) {
v[i + 1] = 1; // Agar word vowel se start aur end hota hai, to v[i+1] ko 1 se mark karo
}
v[i + 1] += v[i]; // Prefix sum calculate karo
}
vector ans; // Result vector
for (auto& i : queries) {
ans.push_back(v[i[1] + 1] - v[i[0]]); // Query ke liye answer calculate karke ans mein push karo
}
return ans; // Result ans return karo
}
};
Words Ki Length Aur Prefix Sum Array:
cppint n = words.size(); vector<int> v(n+1, 0);
n
ko words ki length mein store karte hain aur ek vectorv
create karte hain jisme initially sab 0 hota hai. Isse hum prefix sum array banayenge.Har Word Ko Check Karna:
cppfor (int i = 0; i < n; i++) { if ((words[i][0] == 'a' || words[i][0] == 'e' || words[i][0] == 'i' || words[i][0] == 'o' || words[i][0] == 'u') && (words[i][words[i].length() - 1] == 'a' || words[i][words[i].length() - 1] == 'e' || words[i][words[i].length() - 1] == 'i' || words[i][words[i].length() - 1] == 'o' || words[i][words[i].length() - 1] == 'u')) { v[i + 1] = 1; } v[i + 1] += v[i]; }
Is loop mein, har word ko check karte hain ki kya wo vowel se start aur end hota hai:
Pehli condition:
words[i][0]
(first character) vowel hona chahiye.Dusri condition:
words[i][words[i].length() - 1]
(last character) vowel hona chahiye.
Agar dono conditions satisfy hoti hain, toh
v[i + 1]
ko 1 set karte hain. Fir, prefix sum calculate karte hain aurv[i + 1]
mein previous prefix sum ko add karte hain.Queries Ka Solution:
cppvector<int> ans; for (auto& i : queries) { ans.push_back(v[i[1] + 1] - v[i[0]]); }
Ab, har query ke liye, prefix sum array ka use karke answer calculate karte hain:
v[i[1] + 1]
mein prefix sum store hota hai from start tori
.v[i[0]]
mein prefix sum store hota hai from start toli-1
.Difference
v[i[1] + 1] - v[i[0]]
dega count of vowel strings within range[li, ri]
.
Result Return Karna:
cppreturn ans;
Finally, sab queries ke answers
ans
vector mein store hote hain jise hum return karte hain.