Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

จำกัดการเกิดอักขระที่ซ้ำกันเพียงครั้งเดียวใน JavaScript


ปัญหา

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