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