Ən uzun palindromik alt sətir LeetCode Həlli


Tez-tez soruşulur Çiy kərpic Amazon alma Bloomberg ByteDance Facebook google Infosys LinkedIn microsoft Kahin Salesforce Tesla Walmart Laboratoriyaları Wayfair Yahoo Zoho
LeetCode LeetCodeSolutions tiktokBaxılıb 140

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Problem bəyanat

The Ən uzun palindromik alt sətir LeetCode Həlli – “Ən uzun palindromik alt sətir” bildirir ki, Sizə s sətri verilmişdir, ən uzun palindromik alt sətiri s ilə qaytarın.

Qeyd: Palindrom irəli ilə eyni şəkildə geri oxunan sözdür, məsələn, xanım.

Misal:

Ən uzun palindromik alt sətir LeetCode HəlliPin

 

s = "babad"
"bab"

Explanation:

Hamısı unikal palindromik alt sətirlər bunlar: “b”, “a”, “d”, “bab”, “aba”.

Bunlardan “bab” və “aba”dır ən uzun alt sətirlər.

s = "cbbd"
"bb"

Explanation:

Bütün unikal palindromik alt sətirlər bunlardır: “c”, “b”, “d”, “bb”.

Bunlardan “bb” dir ən uzun alt sətir.

Brute Force Həll

Idea:

Biz bütün alt sətirləri yoxlayın və hansı alt sətirlərin palindrom olduğunu yoxlayın, sonra onların arasında ən uzununu götürün. 

Kodu

Ən uzun palindromik alt sətir LeetCode Həllinin C++ Proqramı

#include <bits/stdc++.h>
using namespace std;

bool check(string &s, int i, int j)
{
    while (i <= j)
    {
        if (s[i] != s[j])
        {
            return false;
        }
        i++, j--;
    }
    return true;
}
string longestPalindrome(string s)
{
    int n = s.length();
    int max_len = 0;
    int starting_index = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = i; j < n; j++)
        {
            if (check(s, i, j))
            {
                if (j - i + 1 > max_len)
                {
                    max_len = j - i + 1;
                    starting_index = i;
                }
            }
        }
    }
    return s.substr(starting_index, max_len);
}
int main()
{
    string s = "babad";
    cout << longestPalindrome(s) << endl;
    return 0;
}

 

bab

Ən Uzun Palindromik Substring LeetCode Həllinin JAVA Proqramı

public class TutorialCup {
    public static Boolean check(String s, int i, int j) {
        while (i <= j) {
            if (s.charAt(i) != s.charAt(j)) {
                return false;
            }
            i++;
            j--;
        }
        return true;
    }

    public static String longestPalindrome1(String s) {
        int n = s.length();
        int max_len = 0;
        int starting_index = 0;
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                if (check(s, i, j)) {
                    if (j - i + 1 > max_len) {
                        max_len = j - i + 1;
                        starting_index = i;
                    }
                }
            }
        }
        return s.substring(starting_index, starting_index + max_len);
    }

    public static void main(String[] args) {
        String s = "babad";
        System.out.println(longestPalindrome(s));
    }
}
bab

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi

Yuxarıdakı kodun zaman mürəkkəbliyi O(n^3)-dir, çünki biz bütün alt sətirlər üzərindən keçirik və sonra onun palindrom olub-olmadığını yoxlayırıq. n^2 alt sətir var və alt sətri yoxlamaq O(n) vaxtını alır, ona görə də ümumi vaxt mürəkkəbliyi O(n^3) təşkil edir.

Kosmik Mürəkkəblik

Yuxarıdakı kodun kosmik mürəkkəbliyi O (1) çünki biz heç bir əlavə yerdən istifadə etmirik.

Optimallaşdırılmış Həll

Idea:

Fikir yenə eynidir. Hər alt sətir üçün biz edəcəyik palindrom olub olmadığını yoxlayın ya yox, əgər belədirsə, biz onların arasında ən uzununu alacağıq. Yeganə dəyişiklik odur ki, əgər alt sətir a olarsa, indi biz saxlayacağıq palindrom ya yox "dp" massivində. 

İndi başlanğıc indeksi “i” və son indeksi “j” olan alt sətirin palindrom olub-olmadığını yoxlamaq üçün sadəcə iki şərti yoxlamaq lazımdır,

  1.  Əgər i-ci və j-ci simvolları sim bərabərdirvə 
  2. Başlanğıc indeksi i+1 və son indeksi j-1 olan alt sətir palindromdur.

Əgər yuxarıdakı şərtlərin hər ikisi doğrudursa, deməli bu alt sətir də palindromdur. 

Kodu

Ən uzun palindromik alt sətirin C++ proqramı

#include <bits/stdc++.h>
using namespace std;
int solve(vector<vector<int>> &dp, int i, int j, string &s)
{
    if (dp[i][j] != -1)
    {
        return dp[i][j];
    }
    dp[i][j] = 0;
    if (i == j)
    {
        return dp[i][j] = 1;
    }
    if (j - i == 1)
    {
        if (s[i] == s[j])
        {
            return dp[i][j] = 1;
        }
        else
        {
            return dp[i][j];
        }
    }
    if (s[i] == s[j] && solve(dp, i + 1, j - 1, s) == 1)
    {
        return dp[i][j] = 1;
    }
    return dp[i][j];
}
string longestPalindrome(string s)
{
    int n = s.length();
    int max_len = 0;
    int starting_index = 0;
    vector<vector<int>> dp(n, vector<int>(n, -1));
    for (int i = 0; i < n; i++)
    {
        for (int j = i; j < n; j++)
        {
            solve(dp, i, j, s);
            if (dp[i][j] == 1)
            {
                if (j - i + 1 > max_len)
                {
                    max_len = j - i + 1;
                    starting_index = i;
                }
            }
        }
    }
    return s.substr(starting_index, max_len);
}
int main()
{
    string s = "babad";
    cout << longestPalindrome(s) << endl;
    return 0;
}
bab

JAVA Proqramı Ən uzun Palindromik Substring

public class TutorialCup {
    public static int solve(int[][] dp, int i, int j, String s) {
        if (dp[i][j] != -1) {
            return dp[i][j];
        }
        dp[i][j] = 0;
        if (i == j) {
            return dp[i][j] = 1;
        }
        if (j - i == 1) {
            if (s.charAt(i) == s.charAt(j)) {
                return dp[i][j] = 1;
            } else {
                return dp[i][j];
            }
        }
        if (s.charAt(i) == s.charAt(j) && solve(dp, i + 1, j - 1, s) == 1) {
            return dp[i][j] = 1;
        }
        return dp[i][j];
    }

    public static String longestPalindrome(String s) {
        int n = s.length();
        int max_len = 0;
        int starting_index = 0;
        int dp[][] = new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                dp[i][j] = -1;
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                solve(dp, i, j, s);
                if (dp[i][j] == 1) {
                    if (j - i + 1 > max_len) {
                        max_len = j - i + 1;
                        starting_index = i;
                    }
                }
            }
        }
        return s.substring(starting_index, starting_index + max_len);
    }

    public static void main(String[] args) {
        String s = "babad";
        System.out.println(longestPalindrome(s));
    }
}

 

bab

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi

Yuxarıdakı kodun zaman mürəkkəbliyi O(n^2)-dir, çünki biz bütün alt sətirlər üzərindən keçirik və sonra hər bir alt sətirin palindrom olub olmadığını yoxlamaq ya yox. n^2 alt sətir var və alt sətirin yoxlanılması O(1) vaxt tələb edir, ona görə də ümumi vaxt mürəkkəbliyi O(n^2) təşkil edir.

Kosmik Mürəkkəblik

Yuxarıdakı kodun kosmik mürəkkəbliyi O (n ^ 2) çünki biz alt sətirin palindrom olub-olmadığını saxladığımız dp massivindən istifadə edirik.

arayış https://en.wikipedia.org/wiki/Palindrome

Crack Sistemi Dizayn Müsahibələri
Translate »
3