【问题标题】:What index should i put in for the insert function in stack?我应该为堆栈中的插入函数放入什么索引?
【发布时间】:2013-08-13 07:26:27
【问题描述】:
我正在尝试使用堆栈的基本概念编写一个程序来检查输入的字符串是否是回文。我很困惑在 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")
【问题讨论】:
标签:
python
palindrome
stack
【解决方案1】:
正如 Ashwini Chaudhary 所说,使用双端队列很容易解决这个问题,它允许从两端轻松弹出。
import collections
def is_palindrome(string):
palindrome = collections.deque(string)
while len(palindrome) > 1:
if palindrome.popleft() != palindrome.pop():
return False
return True
【解决方案2】:
虽然这个问题肯定可以用栈来解决,但我想我有一个简单的迭代方法可以提供:
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
这是一个测试:
print palindrome("sees")
print palindrome("racecar")
print palindrome("not a palindrome")
print palindrome("madam")
结果:
True
True
False
True
【解决方案3】:
好吧,如果您正在寻找更简单的方法...最简单的方法就是使用切片:
def is_pal(a):
return a == a[::-1]
这方面有很多变化,主要涉及从头开始的迭代。
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 回文),则无需遍历整个字符串,只需在中间相遇即可:
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))
这最终与您在两端弹出双端队列时所做的非常接近。