Tanmoy Sarker
Tanmoy Sarker

Reputation: 1266

Remove consecutive characters from string until it doesn't have any consecutive characters

If you see two consecutive characters that are the same, you pop them from left to right, until you cannot pop any more characters. Return the resulting string.

let str = "abba"

"abba" - pop the two b's -> "aa"

"aa" - pop the two a's -> ""

return ""

Here's what i have tried so far:

function match(str){
    
 for (let i = 0; i< str.length; i++){
   if (str[i] === str[i+1]){
     return str.replace(str[i], ""); 
   
    } 
  }
};
match('abba');

But it replaces one character only.The problem is if any two consecutive characters matches it needs to remove both of those and console (Like 'abba' to 'aa'). Then it needs to go over the updated string to do the same thing again (Like 'aa' to '')and console until the return string can't be changed anymore.

Here's another solution i found:

function removeAdjacentDuplicates(str) {
    let newStr = '';
    for (let i = 0; i < str.length; i++) {
        if (str[i] !== str[i + 1])
            if (str[i - 1] !== str[i])
                newStr += str[i];
    }
    return newStr;
};
removeAdjacentDuplicates('abba');

But this iterates one time only. I need this to go on until there's no more consecutive characters. Also It would be great if good time complexity is maintained.

Upvotes: 2

Views: 768

Answers (2)

Spectric
Spectric

Reputation: 31992

You can use a while loop to continuously loop until the result is equal to the previous result.

function removeAdjacentDuplicates(str) {
    let newStr = '';
    for (let i = 0; i < str.length; i++) {
        if (str[i] !== str[i + 1])
            if (str[i - 1] !== str[i])
                newStr += str[i];
    }
    return newStr;
};
let before = 'abba';
let result = removeAdjacentDuplicates(before);
while(result != before){
  before = result;
  result = removeAdjacentDuplicates(before);
}
console.log(result);

If you want to add a limit to the number of pops, you can store the maximum pops in a variable and the number of pops in another (incremented in the loop), then add an expression to the while loop that instructs it not to execute when the number of pops is no longer smaller than the maximum number of pops permitted.

E.g:

function removeAdjacentDuplicates(str) {
  let newStr = '';
  for (let i = 0; i < str.length; i++) {
    if (str[i] !== str[i + 1])
      if (str[i - 1] !== str[i])
        newStr += str[i];
  }
  return newStr;
};
let before = 'cabbac';
let result = removeAdjacentDuplicates(before);
const maxPop = 2;
var pops = 1; //It's 1 because we already removed the duplicates once on line 11
while (result != before && pops < maxPop) {
  before = result;
  result = removeAdjacentDuplicates(before);
  pops++;
}
console.log(result);

Upvotes: 1

Unmitigated
Unmitigated

Reputation: 89404

You can use a regular expression to match consecutive characters and keep replacing until the string is unchanged.

function f(s) {
  while (s != (s = s.replace(/(.)\1+/g, '')));
  return s;
}
console.log(f("abba"))

Upvotes: 0

Related Questions