منتشر شده در

د متن سره تړلو عام ننګونو سره مخ کېدل: د ټایپ سکریپټ کیسه

نویسندگان

ستخراج حروف مشترک از چند رشته در جاوا اسکریپت

https://github.com/ImBIOS/common-char-extractor-ts

در قلمرو مصاحبه های برنامه نویسی، چالش های الگوریتمی نه تنها به عنوان آزمون دانش فنی عمل می کنند، بلکه به عنوان پنجره ای به هوش حل مسئله نامزدها نیز عمل می کنند. یکی از این مشکلات جذاب، که اغلب با آن روبرو می شویم، در مورد دستکاری رشته ها است - یک مهارت اساسی در زرادخانه یک توسعه دهنده. امروز، ما به یک مسئله جذاب غوطه ور می شویم: شناسایی حروف مشترک در چندین رشته، و چگونگی حل آن با استفاده از TypeScript.

چالش آشکار شده

وظیفه پیش رو به ظاهر ساده بود اما در عین حال پیچیده بود: با توجه به آرایه ای از رشته ها، ما باید تابعی بنویسیم که آرایه ای از حروف را که در همان موقعیت در تمام رشته ها ظاهر می شوند، استخراج و برگرداند. برای مثال، با توجه به ورودی ["abcd", "bcd", "cde", "cdef"]، خروجی مورد انتظار ["c", "d"] خواهد بود، که نشان دهنده این است که 'c' و 'd' حروف مشترک هستند که در تمام رشته ها در موقعیت های متناظر مشترک هستند.

ساختن راه حل

سفر ما با انتخاب TypeScript برای راه حل آغاز شد - تصمیمی که توسط سیستم نوع قوی TypeScript هدایت شد، که قابلیت اطمینان کد و بهره وری توسعه دهنده را افزایش می دهد. اولین قدم شامل تکرار روی هر کاراکتر رشته اول بود، با استفاده از آن به عنوان مرجع برای مقایسه با کاراکترهای متناظر در رشته های بعدی.

/**
 * استخراج و بازگرداندن آرایه ای از حروف که در همان موقعیت ظاهر می شوند
 * در تمام رشته های موجود در آرایه ورودی.
 *
 * @param {string[]} words - آرایه ای از رشته ها که باید تجزیه و تحلیل شوند.
 * @returns {string[]} آرایه ای از حروف که در تمام رشته های ارائه شده مشترک هستند،
 * حفظ ترتیب ظاهر آنها در رشته اول.
 */
export function extractCommonLetters(words: string[]): string[] {
  if (words.length === 0) {
    return []
  }

  const copiedWords = [...words]
  const result: string[] = []
  const referenceWord = copiedWords[0]

  // تکرار بر روی هر کاراکتر در کلمه اول
  for (let i = 0; i < referenceWord.length; i++) {
    const currentChar = referenceWord[i]
    let isCharCommonAcrossWords = true

    // بررسی کنید که آیا کاراکتر فعلی در هر یک از کلمات دیگر وجود دارد
    for (let j = 1; j < copiedWords.length; j++) {
      const word = copiedWords[j]
      const charIndex = word.indexOf(currentChar)

      // اگر کاراکتر یافت نشد، بشکنید و پرچم را به false تنظیم کنید
      if (charIndex === -1) {
        isCharCommonAcrossWords = false
        break
      } else {
        // کاراکتر یافت شده را از کلمه حذف کنید تا با تکرارها مقابله کنید
        copiedWords[j] = word.slice(0, charIndex) + word.slice(charIndex + 1)
      }
    }

    // اگر کاراکتر در تمام کلمات مشترک است، آن را به نتیجه اضافه کنید
    if (isCharCommonAcrossWords) {
      result.push(currentChar)
    }
  }

  return result
}

این قطعه کد خلاصه ای از رویکرد ما را نشان می دهد، که بر خوانایی و منطق ساده برای حل مسئله تاکید می کند.

فراتر رفتن: آزمایش راه حل

برای تأیید راه حل خود، ما از مجموعه ای از موارد آزمایشی استفاده کردیم که سناریوهای مختلفی را پوشش می دهند - از موارد اساسی تا موارد پیچیده تر که شامل کاراکترهای ویژه و حساسیت به حروف بزرگ و کوچک می شوند. این آزمایش کامل اطمینان حاصل کرد که الگوریتم ما در طیف گسترده ای از ورودی ها، مقاوم و صحیح است.

تجزیه و تحلیل پیچیدگی فضا و زمان

پس از تفکر، پیچیدگی زمانی راه حل ما عمدتاً توسط تعداد کاراکترهای موجود در رشته اول (این را به عنوان N مشخص می کنیم) و تعداد کل رشته ها (این را به عنوان M مشخص می کنیم) تعیین می شود. برای هر کاراکتر در رشته اول، حضور آن را در موقعیت متناظر در تمام رشته های دیگر بررسی می کنیم، که منجر به پیچیدگی زمانی O(N*M) می شود.

پیچیدگی فضایی راه حل ما O(N) است، زیرا حروف مشترک را در یک آرایه ذخیره می کنیم. در بدترین سناریو، که همه کاراکترها در تمام رشته ها مشترک هستند، اندازه این آرایه متناسب با طول رشته اول خواهد بود.

مسیرهایی برای بهبود

در حالی که راه حل ما برای تعداد متوسط ​​رشته ها و کاراکترها کارآمد است، همیشه جای برای بهینه سازی وجود دارد. در اینجا چند استراتژی برای افزایش بیشتر عملکرد آن آورده شده است:

  1. خاتمه زودهنگام: اگر در هر نقطه ای یک کاراکتر در موقعیت متناظر در تمام رشته ها مطابقت نداشته باشد، می توانیم زودتر از حلقه خارج شویم، و مقایسه های غیر ضروری را ذخیره کنیم.

  2. بهینه سازی برای رشته های کوتاه: شروع با کوتاه ترین رشته به عنوان مرجع، می تواند به طور بالقوه تعداد تکرارها را کاهش دهد، زیرا تعداد حداکثر کاراکترهای قابل بررسی را به حداقل می رساند.

  3. پردازش موازی: برای مجموعه داده های بزرگ، استفاده از تکنیک های پردازش موازی برای مقایسه همزمان کاراکترها در بین رشته ها، می تواند زمان اجرای را به طور قابل توجهی کاهش دهد.

  4. تکنیک های هشینگ: استفاده از یک نقشه هش برای ردیابی موقعیت و وقوع کاراکتر، ممکن است راهی پیچیده تر برای شناسایی کاراکترهای مشترک ارائه دهد، به ویژه هنگام برخورد با مجموعه های گسترده ای از رشته ها.

افکار پایانی

چالش حروف مشترک، گواهی چشمگیری بر ظرافت مشکلات دستکاری رشته ها است، که توسعه دهندگان را به کاوش در ظرافت الگوریتم ها و ساختارهای داده دعوت می کند. از طریق TypeScript، نه تنها راه حلی پیدا کردیم، بلکه سفری از وضوح، امنیت نوع و حل مسئله کارآمد را در آغوش گرفتیم.

همانطور که به پایان می رسیم، باید به خاطر داشته باشیم که سفر از طریق چالش های کدنویسی به اندازه مقصد به مسیر طی شده نیز مربوط می شود. هر مشکل، از جمله این مشکل، فرصتی منحصر به فرد برای ارتقا مهارت های ما، بازنگری در رویکردهای ما و مهمتر از همه، ادامه یادگیری را ارائه می دهد.