আমাদের একটি জাভাস্ক্রিপ্ট ফাংশন লিখতে হবে যা নির্ধারণ করবে যে একটি সিকোয়েন্স থেকে মানগুলোর একটি গ্রুপ কতভাবে সরানো যায়, মূল সিকোয়েন্সটি অর্ডার রক্ষা করে (স্থিতিশীল), এবং নিশ্চিত করবে যে মূল সিকোয়েন্স থেকে প্রতিটি মান শুধু একটি বার সরানো হচ্ছে।
উদাহরণস্বরূপ - যদি সিকোয়েন্স অ্যারে হয় -
const arr = [1, 2, 1, 3, 1, 4, 4];
এবং সরানোর অ্যারে হয় -
const arr2 = [1, 4, 4];
তাহলে উপাদানগুলোর অর্ডার বিঘ্নিত না করে এটি করার তিনটি সম্ভাব্য উপায় আছে -
1 --> [2, 1, 3, 1] 2 --> [1, 2, 3, 1] 3 --> [1, 2, 1, 3]
সুতরাং, এই সিকোয়েন্সগুলো জন্য আমাদের ফাংশনটি ৩ আউটপুট দেবে। কোডটি হবে -
উদাহরণ
const arr = [1, 2, 1, 3, 1, 4, 4];
const arr2 = [1, 4, 4];
const possibleRemovalCombinations = (original, part) => {
const sorter = (a, b) => a - b;
part.sort(sorter);
let place = [];
part.forEach(el => {
place[el] = []
});
original.forEach((el, index) => {
if(place[el]){
place[el].push(index);
}
});
let connection = part.map(el => place[el].slice());
for(let i = 1; i < connection.length; i++){
if (part[i - 1] != part[i]){
continue;
}
let left = connection[i - 1][0];
while(connection[i][0] <= left){
connection[i].shift();
};
};
for (let i = connection.length - 2; i >= 0; i--) {
if(part[i] != part[i + 1]){
continue;
}
let right = connection[i + 1][connection[i + 1].length - 1];
while(connection[i][connection[i].length - 1] >= right){
connection[i].pop();
};
};
const combineArray = (step, prev, combination) => {
for (let i = 0; i < connection[step].length; i++) {
let curr = connection[step][i];
if(prev >= curr && original[prev] == original[curr]){
continue;
}
if(step + 1 == connection.length){
combinations.push(combination.concat([curr]))
}
else {
combineArray(step + 1, curr, combination.concat([curr]));
};
};
};
let combinations = [], res = [];
combineArray(0, -1, []);
for (let i = 0; i < combinations.length; i++) {
let copy = original.slice();
combinations[i].forEach(el => copy[el]);
res[i] = copy.filter(el => el !== undefined);
};
return res.length;
};
console.log(possibleRemovalCombinations(arr, arr2));
আউটপুট
কনসোলে আউটপুট হবে -
3