ปัญหา
เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่ใช้สตริง 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