Периндром үүсгэх хамгийн бага оруулга хийхийг зөвшөөрнө  


Хэцүү байдлын түвшин Дунд
Байнга асуудаг Амазоны CodeNation Directi Google-ийн Үнэндээ Intuit
Динамик програмчлал String

Байршлын хувьд "Сэлгэмэлийг зөвшөөрсөн палиндром үүсгэх хамгийн бага оруулга" гэсэн үг нь танд бүх үсгийг жижиг үсгээр тэмдэглэсэн мөрийг өгдөг. Асуудлын шийдэл нь тэмдэгт мөрийг Палиндром болгож болох тэмдэгтэд хамгийн бага оруулахыг олж мэдэхийг хүсдэг. Тэмдэгтүүдийн байрлалыг мөрөнд өөрчилж болно.

Жишээ нь  

Периндром үүсгэх хамгийн бага оруулга хийхийг зөвшөөрнө

malyalam
1

Тайлбар

Хэрэв бид эхний мөрөнд 'a' нэмж чадвал палиндром үүсгэж болно.

madaam
1

Тайлбар

Анхны мөрийг палиндром болгохын тулд 'd' эсвэл 'a' нэмнэ үү.

Алгоритм  

  1. Мөрний уртыг дараах байдлаар тохируулна уу l ба гаралт 0.
  2. Тунхагла бүхэл тоо массив.
  3. Тэмдэгт бүрийн тоог тоолж хадгална.
  4. Массивыг 0-ээс i <26 хүртэл туулна.
    1. Эсэхийг шалгана уу countChar [i] % 2 == 1,
      1. Хэрэв үнэн бол ++ гаралтыг хий.
  5. Хэрэв гаралт нь 0-тэй тэнцүү бол 0-ийг буцаана.
  6. Бусад буцах гарц-1.

Тайлбар

Танд a мөр, таны өгсөн үүрэг бол Палиндром болохын тулд мөрөнд хийх хамгийн бага оруулгыг олох явдал юм. Тэмдэгтүүдийн байрлалыг мөрөнд өөрчилж болно. Бид тэмдэгт мөрийн тохиолдлыг тоолж массивт хадгалах болно. Үүний цаад санаа нь мөр нь палиндром байх үед мөрний урт нь сондгой байхад сондгой байж болох ганц л тэмдэгт байдаг гэсэн санаа юм. Үүнээс гадна бүх тэмдэгтүүд тэгш давтамжтай байдаг. Тиймээс бид сондгой тоогоор тохиолддог тэмдэгтүүдийг олох хэрэгтэй.

мөн үзнэ үү
Чулуун тоглоом II Leetcode

Бид оролтын мөрийн тэмдэгт бүрийг тоолж массивт хадгалах болно. Дээр хэлсэнчлэн палиндром тэмдэгт мөр нь сондгой тоогоор гарах ганц тэмдэгттэй байж болно. Тиймээс гаралт нь тэмдэгтийн тооноос нэгээр бага байх болно. Тэмдэгтийн мөр бүрийг массивт хадгалсны дараа. Дараа нь бид i = 0-ээс i хүртэлх массивыг 26-аас бага хэмжээтэй болгож байгаа юм. Учир нь нийт 26 тэмдэгт байгаа тул өгөгдсөн мөрөнд 26 тэмдэгт гарах магадлал байна гэж бодъё.

Массивыг дайран өнгөрөхдөө тоолол бүрийг 2-т хуваах нь үнэн бол 1 үлдэх үлдэх эсэхийг шалгаж, гаралтын тоог 1-ээр нэмэгдүүлэх болно (гаралт ++). Массивыг туулсны дараа тоолох нь тэг хэвээр байвал тэмдэгтээр юу ч олдохгүй гэсэн үг бөгөөд тэмдэгт мөр нь аль хэдийн палиндром болсон гэсэн үг бөгөөд бид 0-ийг буцааж өгөх болно (гаралт-1). тэмдэгтийг тоолох, ингэснээр бид гаралт авах боломжтой болсон.

код  

С ++ кодыг хайж олохыг зөвшөөрнө үү. Палиндром үүсгэх хамгийн бага оруулга

#include<iostream>

using namespace std;

int getMinimumInsertion(string str)
{
    int l = str.length(),output = 0;

    int countChar[26] = { 0 };
    for (int i = 0; i < l; i++)
        countChar[str[i] - 'a']++;

    for (int i = 0; i < 26; i++)
        if (countChar[i] % 2 == 1)
            output++;

    return (output == 0) ? 0 : output - 1;
}
int main()
{
    string str = "malyalam";
    cout << getMinimumInsertion(str);

    return 0;
}
1

Палиндром үүсгэх хамгийн бага оруулга олох Java код

class insertionToPalindrome
{
    public static int getMinimumInsertion(String str)
    {
        int l = str.length(),output = 0;

        int countChar[] = new int[26];

        for (int i = 0; i < l; i++)
            countChar[str.charAt(i) - 'a']++;

        for (int i = 0; i < 26; i++)
        {
            if (countChar[i] % 2 == 1)
                output++;
        }

        return (output == 0) ? 0 : output - 1;
    }
    public static void main(String[] args)
    {
        String str = "malyalam";
        System.out.println(getMinimumInsertion(str));
    }
}
1

Нарийн төвөгтэй байдлын шинжилгээ  

Цаг хугацааны нарийн төвөгтэй байдал

O (N) хаана "N" нь оролтын мөр дэх тэмдэгтийн тоо юм.

мөн үзнэ үү
Шилдэг K (эсвэл хамгийн олон давтамжтай) дугаарыг урсгал дээрээс хайж олох

Сансрын нарийн төвөгтэй байдал

O (1), Учир нь бид тогтмол хэмжээтэй нэмэлт массив бүтээсэн. Тиймээс сансрын нарийн төвөгтэй байдал тогтмол байдаг.