您的位置:首页 > 其它

leetcode笔记--Valid Palindrome

2016-02-23 19:20 295 查看
题目:难度(Easy)

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

For example,

"A man, a plan, a canal: Panama" is a palindrome.

"race a car" is not a palindrome.

Note:

Have you consider that the string might be empty? This is a good question to ask during an interview.

For the purpose of this problem, we define empty string as valid palindrome.

Tags:Two Pointers String

Similar Problems:(E) Palindrome Linked List

分析:从串的头部和尾部依次向中间靠拢,逐个比较头尾字符是否相等

代码实现:

class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
s = s.lower()
<span style="color:#ff0000;"><strong>sTest = ""</strong></span>
for i in range(str(s)):
if s[i].isalnum():
<span style="color:#ff0000;"><strong>sTest += s[i]</strong></span>
if len(sTest) == 0 or len(sTest) == 1:
return True
#先把串从中间拆成2段,然后从头部和尾部依次向中间靠拢,逐个比较
mid = len(sTest)/2
i = 0
while i < mid:
if sTest[i] != sTest[-1-i]:
break;
i += 1
return i == mid
逻辑上上述代码并没有问题,可是提交时没有通过一个很长很长的testcase,报了超时的错误:



仔细分析了上面的代码,在if s[i].isalnum():sTest += s[i]中使用了字符串的连接运算’+‘,然而,python 中使用 + 进行字符串连接的操作效率低下,是因为python中字符串是不可变的类型,使用 + 连接两个字符串时会生成一个新的字符串,生成新的字符串就需要重新申请内存,然后将2个旧的字符串依次复制到新串中,这个过程是很费时的。而那个我未通过的testcase差不多有14k行,这么多字符要执行连接操作,每次都要重新申请内存,然后复制,才导致超时。所以我改用list,然后用list的append方法代替连接操作,即sTest
= [ ] ,然后当在if s[i].isalnum():sTest += s[i]满足时, 使用sTest.append(s[i]),就可以了。不过为了更加优化,因为数组寻址也要花时间,所以又继续将代码改成:for letter in s: if letter.isalnum(): sTest.append(letter)。

代码实现:

class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
s = s.lower()
#sTest = ""
<span style="color:#3333ff;"><strong>sTest = []</strong></span>
<span style="color:#3333ff;"><strong>for letter in s:</strong></span>
if letter.isalnum():
#sTest += s[i]
<span style="color:#3333ff;"><strong>sTest.append(letter)</strong></span>
if len(sTest) == 0 or len(sTest) == 1:
return True
#先把串从中间拆成2段,然后从头部和尾部依次向中间靠拢,逐个比较
mid = len(sTest)/2
i = 0
while i < mid:
if sTest[i] != sTest[-1-i]:
break;
i += 1
return i == mid
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: