সমস্যা
আমাদের একটি জাভাস্ক্রিপ্ট ফাংশন লিখতে হবে যা একটি স্ট্রিং (str) নেবে। ফাংশনটি ইনপুট স্ট্রিং-এর ভিত্তিতে একটি নতুন স্ট্রিং তৈরি করবে যেখানে প্রতিটি অক্ষর শুধু একবার থাকবে এবং যেটি রাখা হয়েছে সেটি লেক্সিকোগ্রাফিক্যালি সবচেয়ে ছোট স্ট্রিং বানাবে।
উদাহরণস্বরূপ, ইনপুট যদি হয় –
const str = 'cbacdcbc';
তবে আউটপুট হবে –
const output = 'acdb';
আউটপুট ব্যাখ্যা:
মনে রাখবেন 'c' এর যেকোনো ওকরেন্স মুছে ফেলা যেতো, কিন্তু আমরা সবচেয়ে প্রথমটিই মুছে ফেললাম যাতে স্ট্রিংটি লেক্সিকোগ্রাফিক্যালি সবচেয়ে ছোট হয়। 'a' এবং 'b'-র জন্যও একই।
উদাহরণ
কোডটি নিচের মতো –
const str = 'cbacdcbc'; const removeDuplicates = (str = '') => { if (str.length <= 1) { return str; }; let flag; let string = ""; let legend = new Array(26).fill(-1 let last = "z"; let ind = 0; for (let i = str.length - 1; i > -1; i--) { const element = str[i]; if (legend[element.charCodeAt() - 97] < 0) { legend[element.charCodeAt() - 97] = i; last = element; ind = i; string += element; } else { if (last >= element) { last = element; ind = i; } } } let finalStr = last; while (string.length > finalStr.length) { legend.fill(-1); for (let i = str.length - 1; i > ind; i--) { const element = str[i]; if (finalStr.indexOf(element) < 0) { if (legend[element.charCodeAt() - 97] < 0) { legend[element.charCodeAt() - 97] = i; last = element; flag = i; } else { if (last >= element) { last = element; flag = i; } } } } ind = flag; finalStr += last; } return finalStr; }; console.log(removeDuplicates(str));কোড ব্যাখ্যা:
আইডিয়া হল – প্রথমে পুরো স্ট্রিং লুপ করে চেক করা হয় কোন অক্ষরগুলো ব্যবহৃত হয়েছে, এবং সবচেয়ে ছোট শুরুর অক্ষর वाला সাবস্ট্রিং খুঁজে বের করা হয়েছে যেটিতে সব অক্ষর আছে। ডানে থেকে বামে লুপ করা সহজ। তারপর সেই সাবস্ট্রিং-এ (শুরুর ছোট অক্ষর বাদ দিয়ে) আবার ডানে থেকে বামে লুপ করা হয়, কিন্তু ইতিমধ্যে স্টোর করা অক্ষরগুলো উপেক্ষা করে।
আউটপুট
কনসোলে আউটপুট হবে –
acdb