• 『力扣每日一题08』验证回文串


    一、题目

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

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

    给你一个字符串 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 是一个空字符串 "" 。
    由于空字符串正着反着读都一样,所以是回文串。

    二、思路解析

    不幸的是,这道题我又没做出来,不过我又学到一种解题方法!

    定义的 i 和 j 这两个变量,就是类似两个指针的作用,一个用于从前向后遍历,另一个则是从后向前遍历。

    中间碰到非数字和字母的元素就跳过,要是 i 不等于 j 了,就说明该字符串不是回文串了。

    需要注意的就是,i 要一直走到一个合法的字符那里  有可能i要走很多步。

    j 也是同理,因此要有条件判断,能让 i++ 和 j-- 。而这个条件就是我前面说的 “判断是否为数字和字母” 。

    最后再对元素进行判断即可,看看 i 和 j 是否相等,返回 true 或者 false 即可~

    三、完整代码

    1. class Solution {
    2. public boolean isNumOrCharacter(char ch) {
    3. if(ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'z') {
    4. return true;
    5. }
    6. return false;
    7. }
    8. public boolean isPalindrome(String s) {
    9. s = s.toLowerCase();
    10. int i = 0;
    11. int j = s.length()-1;
    12. while (i < j) {
    13. while (i < j && !isNumOrCharacter(s.charAt(i))) {
    14. i++;
    15. }
    16. while (i < j &&!isNumOrCharacter(s.charAt(j))) {
    17. j--;
    18. }
    19. if(s.charAt(i) == s.charAt(j)) {
    20. i++;
    21. j--;
    22. }
    23. else {
    24. return false;
    25. }
    26. }
    27. return true;
    28. }
    29. }

    以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!

  • 相关阅读:
    Adobe Auditon 如何将音频文件切分成多段,并保存为多个单独的文件
    【Linux】线程池
    Linux信号量(简易版)
    R6G azide, 5-isomer具有良好的水溶性,2135330-71-9
    [mysql] 深入分析MySQL版本控制MVCC规则--实测 (mysql 8.0 innodb引擎)
    vue实现刷新页面随机切换背景图【适用于登陆界面】
    【疑难攻关】——文件包含漏洞
    信息学奥赛一本通 连接格点
    数据结构-----树和二叉树的定义与性质
    第14章 类型信息
  • 原文地址:https://blog.csdn.net/C_Small_Cai/article/details/132765875