Palindrome String
Bir dize, soldan sağa ve sağdan sola aynı şekilde okunduğunda (örneğin level) palindrom olur. Küçük İngilizce harflerden oluşan bir s dizesi alan ve s bir palindromsa true, değilse false döndüren bir fonksiyon yaz.
Fonksiyon
- sstring
- kontrol edilecek küçük harfli dize
- Döndürürboolean
- s her iki yönde de aynı okunuyorsa doğru
Kısıtlar
1 ≤ s.length ≤ 5 × 104syalnızca küçük İngilizce harfler (ailezarası) içerir.
Örnekler
- Girdi
- s = "racecar"
- Çıktı
- true
- Açıklama
- Dıştan içe doğru karşılaştır:
riler,ailea,cilec. Ortadakie'nin bir eşi yok ve eşe ihtiyacı da yok, bu yüzden yanıttrue.
- Girdi
- s = "abba"
- Çıktı
- true
- Açıklama
- Uzunluk çift olduğunda her harfin bir eşi vardır: iki
aeşleşir ve ikibeşleşir, dolayısıyla yanıttrueolur.
- Girdi
- s = "coddy"
- Çıktı
- false
- Açıklama
- İlk harf
cve son harfyzaten farklıdır, bu yüzdencoddybir palindrom değildir ve cevapfalseolur.
Ek soru
Boşlukları ve noktalama işaretlerini atlayıp büyük/küçük harf farkını göz ardı etmek için iki işaretçiyi nasıl değiştirirdin; böylece Was it a car or a cat I saw bir palindrom olarak sayılır?
İpuçları
Tek tek açın. Her biri biraz daha fazlasını gösterir.
sbir palindromsa, ilk karakteri hangi karaktere eşit olmalıdır?iindeksindeki karakter,n-1-iindeksindeki karakterle aynı olmalıdır. Her çiftin yalnızca bir kez kontrol edilmesi gerektiğinden, indekslerin yarısı yeterlidir.Bir indeksi başa, diğerini sona koy. İki karakteri karşılaştır; eşleşmezlerse
falsedöndür ve indeksler buluşana kadar ikisini de bir adım içeri kaydır.
Çözüm
Palindrom, tersten yazılışıyla aynıdır; bu yüzden tersten yazılmış hâlini oluşturup karşılaştırabilirsin. Kopyaya gerek yoktur: ilk karakter son karakterle, ikinci karakter sondan ikinci karakterle eşleşmelidir ve bu böyle devam eder. İçeri doğru ilerleyen iki indeks, bu karakter çiftlerini yerinde test eder ve ilk uyuşmazlıkta durur.
Ters çevrilmiş hâliyle dizeyi karşılaştırın
Sezgi
s dizgesini ters çevirip karşılaştır: racecar ters çevrildiğinde racecar olur ve coddy ters çevrildiğinde yddoc olur. Bir dizge, yalnızca tersiyle eşitse her iki yönde de aynı okunur.
Zaman karmaşıklığı O(n)’dir, ancak ters çevrilmiş kopya O(n) ek alan gerektirir; n = 5 × 10^4 iken 50.000 karakter. İşlem ayrıca her zaman dizgenin tamamını işler: coddy için karar ilk ve son harflerinden verilebilir, ancak önce beş harfin tümü ters çevrilir.
Algoritma
s'nin tersini, dilin tersine çevirme işlevini kullanarak veya son karakterden ilk karaktere doğru ilerleyen bir döngüyle oluştur.- Tersini
sile karşılaştır. - Eşitlerse
true, aksi takdirdefalsedöndür.
def isPalindrome(s):
return s == s[::-1]Her iki uçtan iki işaretçi
Sezgi
Ters çevirme, i indeksini n-1-i indeksine taşır; bu nedenle s, yalnızca her i için s[i], s[n-1-i] değerine eşitse tersiyle tam olarak aynı olur. Bu koşulda her çift iki kez geçtiğinden, sol yarıyı kontrol etmek yeterlidir. racecar dizgesindeki çiftler (0, 6), (1, 5) ve (2, 4) şeklindedir; 3. indeksteki ortadaki e için eş gerekmez.
Farklı olan ilk çift, yanıtın false olduğunu kanıtlar; bu nedenle coddy için sonuca tek karşılaştırmadan sonra ulaşılır. En fazla n / 2 karşılaştırma yapılır; zaman karmaşıklığı O(n), iki indeks için alan karmaşıklığı O(1)'dir. R, dizgeyi önce karakter kodlarından oluşan bir vektör olarak okur; bu işlem O(n) maliyetlidir.
Algoritma
left = 0veright = n-1olarak ayarla.left < rightolduğu süreces[left]iles[right]değerlerini karşılaştır.- Farklılarsa
falsedöndür. - Aksi takdirde
leftdeğerini 1 artır,rightdeğerini 1 azalt ve tekrarla. - İşaretçiler buluştuğunda veya birbirlerini geçtiğinde, her eşleşme tamamlanmıştır:
truedöndür.
def isPalindrome(s):
left, right = 0, len(s) - 1
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True
Tuzaklar ve uç durumlar
- Bir çift eşleşir eşleşmez
truedöndürmek.abcadıştaki çifti geçer ve içteki çiftte başarısız olur; bu yüzdentrueancak döngüden sonra gelir. rightdeğerinin-1yerinenolarak başlatmak, dizinin sonrasını okumaya yol açar (C'de sonlandırıcı'\0'). Lua ve R'de indisler 1'denn'e kadar gider; dolayısıyla bu dillerderightgerçektennile başlar.- C'de dizeleri
==ile karşılaştırmak.reversed == siki işaretçiyi karşılaştırır ve bir kopya için false sonucunu verir;strcmpkullanın. - Ters diziyi
result = result + chile oluşturmak. Her adım o ana kadarki dizeyi kopyalar: 50.000 harf için yaklaşık1.25 × 10^9karakter kopyası. - Swift dizgesini bir tamsayıyla indekslemek: kod derlenmez.
s.utf8üzerinde ilerleyin veya karakterleri bir diziye kopyalayın.
Sıkça sorulan sorular4
Bir dizenin palindrom olup olmadığını nasıl kontrol edersiniz?
İlk karakteri son karakterle, ikinci karakteri sondan ikinci karakterle ve böylece ortaya doğru karşılaştır. Herhangi bir çift farklıysa dizge palindrom değildir. Her iki uçtan başlayıp ortaya doğru ilerleyen iki indeks bunu tek geçişte yapar.
Ek bellek kullanmadan bir palindrom olup olmadığını kontrol edebilir misin?
Evet. İki işaretçili kontrol, karakterleri yerinde okur ve iki dizin saklar; bu nedenle O(1) ek alan kullanır. s dizgesini ters çevrilmiş hâliyle karşılaştırmak daha kısa yazılır, ancak n karakterden oluşan ikinci bir dizge oluşturur.
Palindrom bir dizgeyi kontrol etmenin zaman karmaşıklığı nedir?
Uzunluğu n olan bir dizge için O(n). İki işaretçi kontrolü en fazla n / 2 karşılaştırma yapar ve ilk uyuşmazlıkta durur; bu nedenle coddy bir karşılaştırma yapar.
Tek bir karakter palindrom mudur?
Evet, her iki yönde de aynı okunur. İki işaretçili döngüde left ve right ikisi de 0 indeksinde başlar, döngü hiç çalışmaz ve işlev true döndürür.
Benzer problemler
Aynı fikirleri kullanan problemler. İki üçünü çözmek bir kalıbı kalıcı hale getirir.
def isPalindrome(s):
# Kodu buraya yazınTest #1
Test #2
Test #3
Argüman
s = "racecar"
Beklenen Çıktı
true