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)注意两点:a、判断满足条件的字符  b、大写变小写(本题认为不区分大小写)

       2)字符串为空则true

实现代码:

          class Solution {
public:
    bool isPalindrome(string s) {
             if(s.empty()) return true;
             int len=strlen(s.c_str());
             int j=0;
             for (int i=0;i<len;i++)
             {
                 if (isChar(s[i]))//去其他符合,若有大写则大写变小写
                 {
                     s[i] = tolower(s[i]);//库函数
                     s[j++]=s[i];
                 }
             }
             s[j]='\0';
             if (s[0]=='\0') return true;
             //再次计算新构成字符串的长度;
             int len2=strlen(s.c_str());
             int k=0;
             //while(k<=len2-1-k) //判断是否回文,对称检验;
             for(;k<len2/2;k++)
             {
                 if(s[k]!=s[len2-1-k]) return false;
                 //k++;
             }
             return true;            
     }
         bool isChar(char t)//判断是否满足条件字符
         {
             if ((t >= 'a' && t <= 'z')||(t >= 'A' && t<='Z')||(t >= '0'&& t <= '9'))
            {
                return true;
            }
            else
                return false;         
    }
};

为了判断一个字符串是否是回文,我们可以利用栈的数据结构来辅助实现。以下是使用C语言的一个简单算法: ```c #include <stdio.h> #include <string.h> #include <stdbool.h> #define MAX_SIZE 100 // 判断字符是否是小写字母或数字 bool is_valid_char(char c) { return (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9'); } // 向栈顶压入字符 void push(char* stack, char c) { if (stack == NULL || strlen(stack) == MAX_SIZE) { printf("Stack overflow!\n"); return; } stack[strlen(stack)] = c; stack[strlen(stack) + 1] = '\0'; } // 弹出栈顶字符并检查是否仍为回文 char pop_and_check(char* stack) { if (strlen(stack) == 0) { printf("Stack underflow!\n"); return '\0'; // 或者返回错误标识 } char top = stack[strlen(stack) - 1]; stack[strlen(stack) - 1] = '\0'; return top; } // 主函数,判断给定字符串是否为回文 bool is_palindrome(const char* str) { char stack[MAX_SIZE] = {0}; int i = 0, j = strlen(str) - 1; while (i < j) { // 只保留字母和数字字符 if (!is_valid_char(str[i])) { ++i; continue; } if (!is_valid_char(str[j])) { --j; continue; } push(stack, str[i++]); // 将左半边字符推入栈 pop_and_check(stack); // 检查右半边字符是否匹配 } return strlen(stack) == 0; // 如果栈为空,说明原字符串是回文 } int main() { char input[50]; printf("Enter a string: "); fgets(input, sizeof(input), stdin); input[strcspn(input, "\n")] = '\0'; // 移除换行符 if (is_palindrome(input)) { printf("%s is a palindrome.\n", input); } else { printf("%s is not a palindrome.\n", input); } return 0; } ``` 这个程序首先创建了一个栈,并从字符串的两端开始比较字符。只有当两边都是字母或数字时才会进行操作。如果任何时候栈顶的字符与当前检查的字符不匹配,那么该字符串就不是回文。最后,如果栈完全为空,说明原始字符串是回文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值