Valid Palindrome Leetcode Həlli

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Amazon alma Bloomberg Facebook microsoft Kahin Wayfair
alqoritmlər kodlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutions Sim İki işarəBaxılıb 53

Problem bəyanat

Verilmiş a sim, yalnız alfasayısal simvolları, yəni yalnız rəqəmləri və əlifbaları nəzərə alaraq palindrom olub olmadığını müəyyənləşdirməliyik. Əlifba simvolları üçün halları da görməməyimiz lazımdır.

misal

"A man, a plan, a canal: Panama"
true

Explanation:

“AmanaplanacanalPanama” etibarlı bir palindromdur.

"race a car"
false

Explanation:

“Racecar” palindrom deyil.

Sadəlövh yanaşma (tərs ilə müqayisə)

Bir ipin palindrom olub olmadığını yoxlamaq üçün onu tərs edib orijinal simlə müqayisə edə bilərik. Geri qaldıqdan sonra bərabər qalsa, verilən sətir palindromdur.
Bu problemdə əlifbalar və rəqəmlər xaricindəki bütün simvollara məhəl qoymamalıyıq. Bunun üçün verilən sətri süzə bilərik və istənməyən simvolları silməklə süzülmüş sətri yeni bir dəyişkən saxlaya bilərik. Nümunə götürək:

Valid Palindrome Leetcode Həlli

 

 

 

 

Süzülmüş sətri görə bilərik və tərs süzülmüş sətir bərabər deyil, ona görə də etibarlı palindrom deyil.

Valid Palindrome Leetcode Həlli üçün tətbiqetmə

C ++ Proqramı

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

bool isAlphaNum(char c)
{
    if( (48<=c && c<=57) || (65<=c && c<=90) || (97<=c && c<=122)) 
        return true;
    return false;
}
    
char lowerCase(char c)
{
    if(65<=c && c<=90)
        return c+32;
    else 
        return c;
}
    
bool isPalindrome(string s) 
{
    string input;

    for(char c:s)
    {
        if(isAlphaNum(c))
            input+= lowerCase(c);
    }

    string reversed=input;
    reverse(reversed.begin(),reversed.end());

    if(input==reversed) return true;
    else return false;

}

int main() 
{
    string s="A man, a plan, a canal: Panama";
    if(isPalindrome(s))
        cout<<"true"<<endl;
    else
        cout<<"false"<<endl;

  return 0; 
}
true

Java Proqramı

import java.lang.*;

class Rextester
{  
    static boolean isAlphaNum(char c)
    {
        if( (48<=c && c<=57) || (65<=c && c<=90) || (97<=c && c<=122)) 
            return true;
        else
            return false;
    }
    
    static char lowerCase(char c)
    {
        if(65<=c && c<=90)
            return (char)(c+32);
        else 
            return c;
    }
    
    public static boolean isPalindrome(String s) 
    {
       StringBuffer buf= new StringBuffer();
        
       for(char c: s.toCharArray())
       {
           if(isAlphaNum(c))
               buf.append(lowerCase(c));
       }
        
        String input,reversed;
        input= buf.toString();
        reversed= buf.reverse().toString();
        
        if(input.equals(reversed))
            return true;
        else 
            return false;
        
    }
    
    public static void main(String args[])
    {
       String s="A man, a plan, a canal: Panama";
       System.out.println(isPalindrome(s));   
    }
}
true

Valid Palindrome Leetcode Solution üçün Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

O (n): n - verilən sətrin uzunluğu. Sətri xətti olaraq təkrarlamalıyıq. Beləliklə zaman mürəkkəbliyi O (n) olacaqdır.

Kosmik Mürəkkəblik 

O (n): Süzülmüş simli və tərs simli saxlamaq üçün O (n) əlavə boşluğa ehtiyacımız var.

Optimallaşdırılmış yanaşma (iki göstəricidən istifadə etməklə)

Yuxarıdakı yanaşmada verilmiş sətri süzdük və saxlamaq üçün əlavə yer istifadə etdik. Palindrom olub olmadığını yoxlamaq üçün iki göstəricidən istifadə edə bilərik və əlavə yaddaş yaradaraq süzməməyimizə və saxlamağımıza ehtiyac yoxdur.

1. Nə edə biləriksə, iki göstərici dəyişəni götürək, Başlamaqson və onları giriş sətrinin iki ucu ilə göstərin.
2. İndi hərəkət edin Başlamaq işarəsi sağa, beləcə alfasayısal bir işarəyə işarə edir. Eynilə hərəkət edin son göstərici sola, beləliklə əlifba və ədədi işarəsinə işarə edir.
3. İndi hər iki simvolun eyni olub olmadığını yoxlayın (hallara məhəl qoymadan):

  • Əgər bərabər deyilsə, onda sətirin etibarlı palindrom olmadığını bilirik, buna görə false olaraq qayıdırıq.
  • Başqası növbəti təkrarlamağa davam edin və hər iki göstəricini növbəti əlifba və rəqəm simvoluna qədər göstərmək üçün hərəkət etdirin başlamaq.

4. Döngə bitdikdən sonra ipin palindrom olduğu deyilir və bu səbəbdən geriyə qayıdır.

Valid Palindrome Leetcode Həlli üçün tətbiqetmə

C ++ Proqramı

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

bool isAlphaNum(char c)
{
    if( (48<=c && c<=57) || (65<=c && c<=90) || (97<=c && c<=122)) 
        return true;
    return false;
}
    
char lowerCase(char c)
{
    if(65<=c && c<=90)
        return c+32;
    else 
        return c;
}
    
bool isPalindrome(string s) 
{
        int start=0,end=s.size()-1;
        
        while(start<end)
        {
            while(start<end && !isAlphaNum(s[start])) start++;
            while(start<end && !isAlphaNum(s[end])) end--;
           
            if(lowerCase(s[start])!=lowerCase(s[end]))  return false; 
            
            start++;
            end--;
        }
        
        return true;

}

int main() 
{
    string s="A man, a plan, a canal: Panama";
    if(isPalindrome(s))
        cout<<"true"<<endl;
    else
        cout<<"false"<<endl;

  return 0; 
}
true

Java Proqramı

import java.lang.*;

class Rextester
{  
    static boolean isAlphaNum(char c)
    {
        if( (48<=c && c<=57) || (65<=c && c<=90) || (97<=c && c<=122)) 
            return true;
        else
            return false;
    }
    
    static char lowerCase(char c)
    {
        if(65<=c && c<=90)
            return (char)(c+32);
        else 
            return c;
    }
    
    public static boolean isPalindrome(String s) 
    {
       int start=0,end=s.length()-1;
        
        while(start<end)
        {
            while(start<end && !isAlphaNum(s.charAt(start))) start++;
            while(start<end && !isAlphaNum(s.charAt(end))) end--;
           
            if(lowerCase(s.charAt(start))!=lowerCase(s.charAt(end)))  
                return false; 
            
            start++;
            end--;
        }
        
        return true;
        
    }
    
    public static void main(String args[])
    {
       String s="A man, a plan, a canal: Panama";
       System.out.println(isPalindrome(s));   
    }
}
true

Valid Palindrome Leetcode Solution üçün Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

O (n): Sətrin hər bir simvolunu yalnız bir dəfə ziyarət edirik. Beləliklə zamanın mürəkkəbliyi O (n) -dir.

Kosmik Mürəkkəblik 

O (1): Burada əlavə yaddaşa ehtiyacımız yoxdur.

Şərh yaz

Translate »
1