• 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] = '';
    		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] = '';  
    //      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 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; }

    
    3.【AC源代码】
    

    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.autokeywordauto对象和变量被存储在栈中,它的生命周期仅存在于它的声明所在的块(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)前、后向迭代比对,得到结果。

  • 相关阅读:
    POJ 2411 Mondriaan's Dream -- 状压DP
    codeforces 792A-D
    codeforces 796A-D
    Acdream1201 SuSu's Power
    HDU 2818 Building Block
    C# NetStream
    基于Duff's Device的C简易无栈协程实现
    CentOS 多版本 GCC 共存
    2017杭电多校第一场
    2019杭电多校第十场
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6816766.html
Copyright © 2020-2023  润新知