博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode Valid Palindrome C++&python 题解
阅读量:5968 次
发布时间:2019-06-19

本文共 3239 字,大约阅读时间需要 10 分钟。

题目描写叙述

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.

给定一个 字符串。推断是否是一个回文串,注:这道题中默认空串是回文串

思路分析

首先给出c++代码的思路。由于存在大写和小写的问题,所以须要统一把全部字母统一转为小写或者大写。所以这里使用到了STL中的transform()方法

以下简要记录一下transform()的使用方法。该算法用于容器元素的变换操作,有例如以下两个使用原型。一个将迭代器区间[first,last)中元素,运行一元函数对象op操作。交换后的结果放在[result,result+(last-first))区间中。

还有一个将迭代器区间[first1,last1)的元素*i。依次与[first2,first2+(last-first))的元素*j。运行二元函数操作binary_op(*i,*j)

函数原型

template < class InputIterator, class OutputIterator, class UnaryOperator >  OutputIterator transform ( InputIterator first1, InputIterator last1,                             OutputIterator result, UnaryOperator op );template < class InputIterator1, class InputIterator2,           class OutputIterator, class BinaryOperator >  OutputIterator transform ( InputIterator1 first1, InputIterator1 last1,                             InputIterator2 first2, OutputIterator result,                             BinaryOperator binary_op );

參数解释:

irst1, last1

指出要进行元素变换的第一个迭代器区间 [first1,last1)。
first2
指出要进行元素变换的第二个迭代器区间的首个元素的迭代器位置。该区间的元素个数和第一个区间相等。

result

指出变换后的结果存放的迭代器区间的首个元素的迭代器位置
op
用一元函数对象op作为參数。运行其后返回一个结果值。

它能够是一个函数或对象内的类重载operator()。

binary_op
用二元函数对象binary_op作为參数,运行其后返回一个结果值。它能够是一个函数或对象内的类重载operator()。

给出一段演示样例代码

// transform algorithm example#include 
// std::cout#include
// std::transform#include
// std::vector#include
// std::plusint op_increase (int i) { return ++i; }int main () { std::vector
foo; std::vector
bar; // set some values: for (int i=1; i<6; i++) foo.push_back (i*10); // foo: 10 20 30 40 50 bar.resize(foo.size()); // allocate space std::transform (foo.begin(), foo.end(), bar.begin(), op_increase); // bar: 11 21 31 41 51 // std::plus adds together its two arguments: std::transform (foo.begin(), foo.end(), bar.begin(), foo.begin(), std::plus
()); // foo: 21 41 61 81 101 std::cout << "foo contains:"; for (std::vector
::iterator it=foo.begin(); it!=foo.end(); ++it) std::cout << ' ' << *it; std::cout << '\n'; return 0;}

output:

foo contains: 21 41 61 81 101

以下描写叙述思路

统一转为大写和小写后,利用两个迭代器,一个指向开头。一个指向结尾,每次循环推断,假设不是数字或字母就跳过。假设两个迭代器指向的内容不一致则直接返回,假设相等则两个迭代器同一时候向中间走一步。直到两个指针相遇则推断是回文串

给出代码实现:

class Solution{public:    bool isPalindrome(string s)    {        transform(s.begin(),s.end(),s.begin(),::tolower);        string::iterator left=s.begin(),right=s.end();        while(left

注意这里域运算符::的使用方法,涉及到c++命名空间的问题。假设不加域运算符,会报找不到函数或者变量的错误。

python 解法

这道题用python的列表生成器和列表操作能够非常简洁的解决,思路是先用列表生成器去掉除数字和字母以外的字符得到一个新的字符串,然后直接推断该串和该串的逆序是否相等就可以。

代码实现例如以下

class Solution:    def isPalindrome(self, s):        newS=[i.lower() for i in s if i.isalnum()]        return newS==newS[::-1]

转载于:https://www.cnblogs.com/clnchanpin/p/7191209.html

你可能感兴趣的文章
Ubuntu10.04下配置和使用JDK-Mysql-Tomcat-SVN
查看>>
烂泥:高负载均衡学习haproxy之安装与配置
查看>>
六个国外免费的DNS服务-做英文与外贸必备
查看>>
Hprose开源的高性能远程对象服务引擎
查看>>
Linux下磁盘加密
查看>>
启用预算后的单据没有预算数据的控制说明
查看>>
【IIS7.5服务器问题】未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项.试图加载格式不正确的程序...
查看>>
Httpd2.4简介及CenOS6.6下编译安装
查看>>
解决思维导图软件Mindmanager Mindjet连接出错
查看>>
谷歌logo的“前世今生”
查看>>
Apache配置文件中的deny和allow的使用
查看>>
缓存java框架技术预研4:LazyUnsafeAllocator.java算法分析
查看>>
监控zabbix 服务并在异常时python 邮件报警
查看>>
【转】linux/unix下 pid文件作用浅析
查看>>
4.9.5 通用注释
查看>>
PXE无人值守系统安装配置简要说明
查看>>
冰点文库下载V2绿色版,无需积分自由下载百度,mbalib,豆丁,畅享,hp009,max.book118 文档...
查看>>
composer笔记
查看>>
关于CRM库存初始化的一点小总结
查看>>
IntelliJ IDEA 12 中用 Maven + Jetty 来开发Web项目
查看>>