user9502376
user9502376

Reputation:

JavaScript: How to count repetitive letters in a string and output the numbers right after?

I am trying to display an output like this a3b2c4d3 for a string aaabbccccddd.

I tried the code below but didn't get the desired result.

var countLetters = "aaabbccccddd";
console.log("countLetters.length --->" + countLetters.length);
var countNumberLetter = 0;
var i;
var a;

for (i = 0; i < countLetters.length; i++) {

  if (countLetters[i] == countLetters[i + 1]) {
    countNumberLetter = countNumberLetter + 1;

  }

}

console.log("countNumberLetter--------->" + countLetters[i] + countNumberLetter);

Upvotes: 0

Views: 127

Answers (3)

invalidtoken
invalidtoken

Reputation: 109

const object = {};
const string = "aaabbccccddd";

// To iterate over string
for(let i = 0; i < string.length; i++){
    // if the object has that alphabet just increment it 
    if(object.hasOwnProperty(string.charAt(i))){   
        ++object[string.charAt(i)]; 
    }else{
        // else create a key to the new alphabet and give it a value 1
        object[string.charAt(i)] = 1;
    }
}

let finalString = "";

// To iterate over the object
for(let key in object){
    finalString += key;  // concatenate the key  
    finalString += object[key];  // concatenate the value 
} 

console.log(finalString);

My solution has two loops one to iterate over the string and store the alphabet and there count in an object ( you can use hashmap as well ). The 2nd loop is to iterate over object so that we can make the desired string.

Upvotes: 0

Ori Drori
Ori Drori

Reputation: 193258

Use two loops. Use an outer while to loop the string. Whenever a new letter is encountered, use the for loop to increment count as the long as the letters belong to the same sequence. When done increment the outer counter (i) to get to the next letter:

var countLetters = "aaabbccccddd";
var result = '';
var i = 0;

while (i < countLetters.length) {
  // iterate until current letter, and counted letter are not equal, increment count
  for (var count = 1; countLetters[i] === countLetters[i + count]; count++) {}

  // add current letter and count to string
  result += countLetters[i] + count;

  i += count; // increment outer counter - i
}

console.log(result);

Another solution that uses a String.match() with a regex to get an array of letter sequences. Then maps each sequence to letter + count, and joins them back to a string:

var countLetters = "aaabbccccddd";

var result = countLetters.match(/(\w)\1+/g) // match sequences of the same letter
  .map((s) => s[0] + s.length) // map each sequence to letter with count
  .join(''); // join back to a string

console.log(result);

Upvotes: 1

J Mora
J Mora

Reputation: 26

var hashMap = {};
var countLetters = "aaabbccccddd";
countLetters.split("").forEach((letter) => {
    if(!hashMap[letter]) {
        hashMap[letter] = 0;
    }
    hashMap[letter] = hashMap[letter]+1;
})
var string ='';
for(var i in hashMap) {
    var val = hashMap[i];
    string += i + val;
}

console.log("countNumberLetter--------->",string);

Upvotes: 0

Related Questions