Сообщение от ksa
|
У этой строки как раз всего 3 разных варианта "валидной" расстановки скобок.
|
Притом всё-таки удалили одну пару! Там где
var str='[]][]]'; у вас теряет пару в варианте... []
alex-romanov, каждый запущенный метод имеет конец! Метод важно закрыть! Но удалять запущенные методы нельзя! Вот мой вариант...
{
class IndexedRegExp extends RegExp {
[Symbol.replace](s, f) {
let i = 0;
return s.replace(new RegExp(this), function() {
return f(i++, ...arguments);
});
}
}
class Pairs extends Array {
constructor(string, openingMethod, closingMethod) {
super();
Object.assign(this, { string, openingMethod, closingMethod });
var l = [...string].filter(v => v === closingMethod).length;
var re = new IndexedRegExp(`\\${closingMethod}`,"g");
for (var i = 0, len = 2 ** l; i < len; i++) {
let x = string.replace(re, (j,m) => ((1 << j) & i) === 0 ? "" : closingMethod);
if(this.isValid(x) && !this.includes(x))
this.push(x);
}
}
isValid(string) {
var index = 0;
for(const char of string) {
if(char === this.openingMethod) index++;
else if(char === this.closingMethod) index--;
if(index < 0) return false;
}
return index === 0;
}
}
// Примеры
console.log(new Pairs("[ x] x] [ x]x ]","[","]"));
console.log(new Pairs("[ ] x ] x]","[","]"));
console.log(new Pairs("[ x ] x ] x]","[","]"));
console.log(new Pairs("{}}{}}","{","}"));
console.log(new Pairs("[]][]]","[","]"));
}
Также можете посмотреть интерактивный пример с добавленным функционалом закрытия не закрытых методов! (Если поставите галочку в
Auto Closing)
https://codepen.io/Malleys/pen/rEGjVM?editors=0010