代码训练LeetCode(35)验证回文串

代码训练(35)验证回文串

Author: Once Day Date: 2025年6月17日

漫漫长路,才刚刚开始…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 125. 验证回文串 - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球极客挚爱的技术成长平台

文章目录

      • 代码训练(35)验证回文串
        • 1. 原题
        • 2. 分析
        • 3. 代码实现
        • 4. 总结

1. 原题

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false

示例 1:

输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。

示例 2:

输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。

示例 3:

输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。
2. 分析

我们需要判断一个给定的字符串 s 是否是回文串。一个字符串如果忽略大小写、只考虑字母和数字,并且前后读都一样,那么它就是回文串。

解题思路:

  1. 清理字符串:首先需要将字符串中的所有非字母数字字符移除,并将所有大写字母转换为小写字母。
  2. 判断回文:经过清理后,我们需要判断清理后的字符串是否是回文。

分析步骤:

  1. 遍历字符串:遍历原始字符串,对每个字符检查是否是字母或数字。
  2. 构建新字符串:如果字符是字母或数字,将其加入新字符串中。如果是大写字母,则转换为小写。
  3. 双指针技术:使用两个指针,一个从新字符串的开头,一个从结尾开始,向中间移动,比较两个指针指向的字符是否相同。
  4. 判断:如果所有对应位置的字符都相同,则字符串是回文;如果找到不匹配的字符,则不是回文。

举例分析,以 “A man, a plan, a canal: Panama” 为例:

  • 移除非字母数字字符并转换为小写后得到 “amanaplanacanalpanama”。
  • 从两头开始比较字符,都相同,因此是回文串。

关键点优化:

  • 内存使用:避免使用额外的大数组。在这里,我们只创建了一个足以存放清理后字符串的数组。
  • 执行速度:通过一次遍历进行清理,一次双指针对比来检查回文,保持效率。
3. 代码实现
#include 
#include 
#include 

bool isPalindrome(char *s) {
    int n = 0;
    char cleanStr[1000]; // 假设处理后的字符串不超过1000个字符

    // 清理字符串
    while (*s) {
        if (isalnum(*s)) { // 检查是否为字母或数字
            cleanStr[n++] = tolower(*s); // 转为小写并存储
        }
        s++;
    }
    cleanStr[n] = '\0'; // 确保字符串正确结束

    // 判断是否为回文
    int left = 0, right = n - 1;
    while (left < right) {
        if (cleanStr[left] != cleanStr[right]) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

int main() {
    char str1[] = "A man, a plan, a canal: Panama";
    printf("%s\n", isPalindrome(str1) ? "true" : "false");
    
    char str2[] = "race a car";
    printf("%s\n", isPalindrome(str2) ? "true" : "false");
    
    char str3[] = " ";
    printf("%s\n", isPalindrome(str3) ? "true" : "false");
    
    return 0;
}
4. 总结

通过本题,我们加深了对字符串处理、双指针技术的理解。在实际编程中,处理字符串时常常需要考虑多种边界条件和特殊情况,此题提供了一个很好的练习机会。对于提升编程能力,练习更多类似的字符串处理问题,学习并应用高效的算法和数据结构是关键。

你可能感兴趣的:(#,十年代码训练,leetcode,算法,C)