Показать сообщение отдельно
  #16 (permalink)  
Старый 26.06.2019, 15:52
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от 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

Последний раз редактировалось Malleys, 26.06.2019 в 15:55.
Ответить с цитированием