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
分析:从串的头部和尾部依次向中间靠拢,逐个比较头尾字符是否相等
代码实现:
仔细分析了上面的代码,在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)。
代码实现:
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
相关文章推荐
- iOS涂鸦画板 主要自定义UIView
- POJ 1442 堆的应用 优先队列
- C++学习笔记:MyString类的重载 练习
- 位运算的小技巧
- android绘图canvas.drawBitmap方法的作用
- unable to find valid certification path to requested target或Certificate chaining error的解决办法
- 待字闺中之巧妙排序分析:
- nginx源码初读(7)--让烦恼从数据结构开始(ngx_queue)
- java基础总结(四)
- 二级域名session 共享方案
- eclipse下开发java项目 -- 前端开发想使用 sublime怎么办?(借助gulp自动发布)
- Facade 设计模式
- 使用HttpClient进行远程接口测试
- uibutton点击按钮时title变大 松开时变小
- 自定义View与merge节点
- Ubuntu中安装oracle java和Eclipse
- TLD学习之剥离Randrom Fern
- LeetCode 30 Substring with Concatenation of All Words--In Java
- JVM性能监控与故障处理工具
- Apple Pay--iOS开发