2013-08-12 2 views
0

입력 된 문자열이 스택의 기본 개념을 사용하여 회문인지 확인하는 프로그램을 작성하려고합니다. stack1.insert 함수에 입력 할 색인을 혼동합니다. 도와주세요? 아니면 이보다 더 간단한 접근 방법이 있다고 생각합니까?스택의 삽입 기능을 위해 어떤 색인을 삽입해야합니까?

def palindrome(str1): 
     stack1 = [] 
     palInd = False 
     for chr in str1: 
      stack1.insert(0, chr) 
     for i in range(len(str1)-1): 
      if str1[i]==stack1.pop(): 
       palInd = True 
      else: 
       palInd = False 
     return palInd 

    print palindrome("madam") 
+1

[collections.deque] (http://docs.python.org/2/library/collections.html#deque-objects)를 살펴보면 스택으로 사용할 수 있습니다. –

답변

0

Ashwini Chaudhary가 지적했듯이이 문제는 양쪽 끝에서 쉽게 튀어 나오게하는 deque를 사용하여 쉽게 해결됩니다. 이 문제는 확실히 스택으로 해결 될 수 있지만

import collections 

def is_palindrome(string): 
    palindrome = collections.deque(string) 
    while len(palindrome) > 1: 
     if palindrome.popleft() != palindrome.pop(): 
      return False 
    return True 
0

, 내가 제공하는 단순 반복적 인 접근 방식을 가지고 있다고 생각 :

print palindrome("sees") 
print palindrome("racecar") 
print palindrome("not a palindrome") 
print palindrome("madam") 

결과 : 여기

def palindrome(string): 
    chars = list(string) 
    for i in range(0,len(chars)/2): 
      if (chars[i] != chars[len(chars)-i-1]): 
        return False 
    return True 

그리고 테스트입니다 :

True 
True 
False 
True 
0

당신이 간단한 방법을 찾고 있다면 글쎄, ... 가장 쉬운 방법은 그냥 슬라이스를 사용하는 :

def is_pal(a): 
    return a == a[::-1] 

대부분 끝에서 반복을 포함하는이에 변화가 많이있다.

def is_pal(a): 
    halflen = len(a) // 2 
    forwards,backwards = iter(a[:halflen]), reversed(a[halflen:]) 
    return all(x==y for x,y in zip(forwards,backwards)) 

이것은 끝 :

def is_pal(a): 
    return a == ''.join(reversed(a)) 

def is_pal(a): 
    forwards,backwards = iter(a), reversed(a) 
    return all(x==y for x,y in zip(forwards,backwards)) 

최적의되고있어 기술적 경우 (일부 GIANT 회문을 처리, 아마도) 당신은 단지 중간에 만족, 전체 문자열을 반복 할 필요가 없습니다 양쪽 끝에서 튕겨 나오는 양동이로 정확히 무엇을 할 수 있는지에 가깝습니다.