- I try to solve task below with reduce() and actually the result is ok. But I don’t know how to use acc in reduce() instead of acc1 or indexMax.
- How to apply typescript to this task.
The task: Find first word with max repeated letter count. For example rrrtygggg and ttbvfddjklyyyaseqq – the winner is rrrtygggg. If sequence has no repeated letters return ‘false’. Count only letters, ignor digits and special chars.
Here is my solution.
Also I need to keep time complexity not higher than n. The most important part for me is reduce()
and acc
.
const maxLettersInString =(str)=>{ let acc1={}; let indexMax; let ind=0; let n=0; const newStr = str.replace(/[^a-zs]/gi,'') const arr = str.split(' '); if(arr.length===0) return false; const arr1 = newStr.split(''); const result = arr1.reduce((acc,x)=>{ if(x!==' '){ acc1[x] ? acc1[x]++ : acc1[x] = 1; if(acc1[x]>n) n=acc1[x], indexMax=ind; } if(x===' ') acc1={}, ind+=1; else return indexMax; }) if(n===1) return false return arr[result] } console.log(maxLettersInString('fdsJJHHBldfkfd +=dfsfds tbrlllLLtrbtrbrLL666667777LLtlllllll----- fdsfs66df7758 tRbrerbrrtRR'));
Advertisement
Answer
Iterate over the original words, with two outer variables:
- One with a count of the maximum number of repeated letters found so far (starts at 0), and
- The string corresponding to the count found above
All you need is a simple loop – on each iteration, calculate the repeat count for the current word being iterated over, and if it’s higher than the record so far, reassign the two outer variables.
const getRepeatCount = (str) => { const repeatCounts = {}; for (const char of str.replace(/[^a-z]/gi, '')) { repeatCounts[char] = (repeatCounts[char] ?? -1) + 1; } return Math.max(...Object.values(repeatCounts)); }; const maxLettersInString = (str) => { let maxRepeatsFoundSoFar = 0; let bestWordSoFar = ''; for (const word of str.split(' ')) { const repeatCount = getRepeatCount(word); if (repeatCount > maxRepeatsFoundSoFar) { maxRepeatsFoundSoFar = repeatCount; bestWordSoFar = word; } } return bestWordSoFar === '' ? false : bestWordSoFar; }; console.log(maxLettersInString('rrrtygggg and ttbvfddjklyyyaseqq'));
To turn it into TypeScript, just add : string
to the parameter types and : Record<string, number>
to the repeatCounts
object.
This would be possible to do with .reduce
if the accumulator was an object with two properties, maxRepeatsFoundSoFar
and bestWordSoFar
instead of outer variables – but the typing and syntax noise would be annoying, outer variables are easier.