题目描写叙述

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 <iostream> // std::cout
#include <algorithm> // std::transform
#include <vector> // std::vector
#include <functional> // std::plus int op_increase (int i) { return ++i; } int main () {
std::vector<int> foo;
std::vector<int> 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<int>());
// foo: 21 41 61 81 101 std::cout << "foo contains:";
for (std::vector<int>::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<right)
{
if (!::isalnum(*left))
left++;
else if(!::isalnum(*right))
right--;
else if((*left)!=(*right))
return false;
else
{left++,right--;} }
return true;
}
};

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

python 解法

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

代码实现例如以下

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

leetcode Valid Palindrome C++&amp;python 题解的更多相关文章

  1. [leetcode]Valid Palindrome @ Python

    原题地址:https://oj.leetcode.com/problems/valid-palindrome/ 题意: Given a string, determine if it is a pal ...

  2. LeetCode Valid Palindrome II

    原题链接在这里:https://leetcode.com/problems/valid-palindrome-ii/description/ 题目: Given a non-empty string  ...

  3. [LeetCode] Valid Palindrome 验证回文字符串

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

  4. LeetCode——Valid Palindrome

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

  5. [LeetCode] Valid Palindrome II 验证回文字符串之二

    Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...

  6. Leetcode Valid Palindrome

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

  7. LeetCode: Valid Palindrome [125]

    [题目] Given a string, determine if it is a palindrome, considering only alphanumeric characters and i ...

  8. LeetCode: Valid Palindrome 解题报告

    Valid Palindrome Given a string, determine if it is a palindrome, considering only alphanumeric char ...

  9. [Leetcode] valid palindrome 验证回文

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

随机推荐

  1. 【php】关于尾部去除和分号问题

    One thing to remember is, if you decide to omit the closing PHP tag, then the last line of the file ...

  2. PAT Basic 1067

    1067 试密码 当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过 20 ...

  3. Knockout v3.4.0 中文版教程-2-监控-通过监控创建视图模型(上)

    2. 监控 1.通过监控创建视图模型 1. 监控 Knockout是基于以下三个核心特性: 监控和依赖跟踪 声明式绑定 模板 在本节,你将第一次了解这三个特性,在这之前,我们先来了解以下MVVM模式和 ...

  4. 在后台编辑器Text和Visual切换时,部分代码丢失的解决方法

    function fix_tiny_mce_before_init( $in ) { // You can actually debug this without actually needing A ...

  5. Leetcode 413.等差数列划分

    等差数列划分 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 ...

  6. EXPDP/IMPDP任务的查看与管理

    EXPDP/IMPDP相比传统的exp/imp的最本质区别在于服务器端执行,客户端发出指定后,通过API启动服务器的备份job,在执行过程中,可以拿下Ctrl+C组合键,退出当前交互模式,退出之后,导 ...

  7. ES6 Arrow Function & this bug

    ES6 Arrow Function & this bug let accHeadings = document.querySelectorAll(`.accordionItemHeading ...

  8. IntelliJ IDEA 代码提示快捷键

    1.写代码时用Alt-Insert(Code|Generate…)可以创建类里面任何字段的getter与setter方法. mac版 是ctrl+enter 2.CodeCompletion(代码完成 ...

  9. 【Luogu】P1868饥饿的奶牛(DP)

    题目链接 话说我存一些只需要按照一个关键字排序的双元素结构体的时候老是喜欢使用链式前向星…… DP.f[i]表示前i个位置奶牛最多能吃到的草.转移方程如下: f[i]=f[i-]; f[i]=max( ...

  10. 【Luogu】P1578奶牛浴场(DP,枚举)

    题目链接 枚举极大子矩形.详情请见本题题解:I_AM_HelloWord 代码如下 #include<cstdio> #include<cctype> #include< ...