LeetCode 之 Valid Palindrome(字符串)
【问题描写叙述】
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.
1.【基础知识】
回文字符串是一个正读和反读都一样的字符串,比方“level”或者“noon”等等就是回文串。
2.【屌丝代码】
class Solution { public: bool isPalindrome(string s) { int m(0); char a[100]={'0'}; if(s.size()==0) return true; for(int k =0;k<s.length();k++) { if((s[k]<='z'&&s[k]>='a')||(s[k]>='A'&&s[k]<='Z')) a[m++] = s[k]; } a[m] = '\0'; int i(0),j(strlen(a)-1); while(j>i) { if((a[i]!=a[j])&&(a[i]-a[j]!=32)&&(a[i]-a[j]!=-32)) return false; i++; j--; } return true; } };
【屌丝AC源代码】
#include<iostream> #include<string> using namespace std; class Solution { public: bool isPalindrome(string s) { int m(0); if(s.size()==0) return true; char *a = new char[s.size()-1]; for(int k = 0;k<s.length();k++) { if((s[k]<='z'&&s[k]>='a')||(s[k]>='A'&&s[k]<='Z')||(s[k]>='0'&&s[k]<='9')) a[m++] = s[k]; // if(m>240) // cout<<m<<endl; } // cout<<a<<endl; a[m] = '\0'; // cout<<a<<endl; int i(0),j(m-1); while(j>i) { if(((a[i]<='z'&&a[i]>='a')||(a[i]>='A'&&a[i]<='Z'))&&((a[j]<='z'&&a[j]>='a')||(a[j]>='A'&&a[j]<='Z'))) if((a[i]!=a[j])&&((a[i]-a[j]!=32)&&(a[i]-a[j]!=-32))) return false; else { i++;j--;continue; } if(a[i]!=a[j]) return false; i++; j--; } return true; } }; int main() { /* cout<<sizeof(int)/sizeof(char)<<endl; cout<<sizeof(unsigned int)/sizeof(char)<<endl; cout<<sizeof(long int)/sizeof(char)<<endl; cout<<sizeof(double)/sizeof(char)<<endl; */ // string mystr = "tyQZrD2 7UL91z,i`O2ef:6e'2\"yP !:,U.:pX90PU3CXo'i!;3 `j 0?\"'hK8 ? BAjM2\"DBw?7!4R3?U2E8F2y!?3.【AC源代码】3 R2!fw 6e!:0 ErCi98KM`,8`8648,mi3P0`,!5 E.?00J3A 52\"x8,tHy!'2!DLBbK'j!tt1C' 7`JPulW\"\"uRTbr\"',\",U`ZOW5'\"LMDQDMJ\"'5WOZ`U,\",'\"rbTRu\"\"WluPJ`7 'C1tt!j'KbBJD!2'!yHt,8x\"25 A3J00?.E 5!,`0P3im,8468`8,`MK89iCrE 0:!e6 wf!2R 3?!y2F8E2U?
3R4!7?wBD\"2MjAB ? 8Kh'\"?0 j` 3;!i'oXC3UP09Xp:.U,:! Py\"2'e6:fe2O`i,z19LU7 2DrZQyt"; string mystr = "ab2A"; Solution my; cout<<my.isPalindrome(mystr)<<endl; /* cout<<mystr.size()<<endl; cout<<mystr[0]<<endl; cout<<mystr[mystr.size()-1]<<endl; */ return 0; }
class Solution { public: bool isPalindrome(string s) { transform(s.begin(), s.end(), s.begin(), ::tolower);// 字符串所有改为小写输出到 s 之中 auto left = s.begin(); auto right = prev(s.end()); while (left < right) { if (!::isalnum(*left)) { ++left; continue;} if (!::isalnum(*right)) { --right; continue;} if (*left != *right) return false; else{ left++, right--; } } return true; } };4.【复盘】
1.失误点:considering only alphanumeric characters and ignoring cases 理解为回文的约束为字符且忽略其大写和小写。alphanumeric characters原意是数组和字符的,没考虑到数字,导致直接实现存在问题;
2.transform 使用方法详见文章 简单的程序诠释C++ STL算法系列之十八:transform
详址:http://blog.csdn.net/jerryjbiao/article/details/7523110
3.autokeyword:auto对象和变量被存储在栈中,它的生命周期仅存在于它的声明所在的块(block)中。
在块中定义的块假设不加其他的修饰符则都是auto类型的。
autokeyword能够省去。auto对象和变量对外部模块都是不可见的。
详见:C/C++中涉及存储方式的keyword:auto,static,register,extern
4.int isalnum ( int c );//检查字符是否是字母或者数字。
详见:isalnum <ctype.h> <cctype>。
详址:http://blog.csdn.net/snowdream86/article/details/6889276
5.定义函数:int tolower(int c);头文件:#include <stdlib.h>;函数说明:若參数 c 为大写字母则将该相应的小写字母返回。
详见 :tolower
详址:http://blog.csdn.net/Michaelwubo/article/details/41080495
5.【算法核心思想】
【屌丝AC源代码】
1)剔除字符串中非字母、数字字符;
2)非大写和小写关系的不相等以及普通的不等构成判据;
3)前、后向迭代比对,得到结果。
【AC源代码】
1)tolower方法,字符串转小写;
2)islnum方法。滤除标点字符得到推断;
3)前、后向迭代比对,得到结果。