给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。
本题中,将空字符串定义为有效的 回文串 。示例 1:
输入: s ="A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串示例 2:
输入: s ="race a car"
输出:false
解释:"raceacar" 不是回文串提示:
1<= s.length <=2*105
字符串 s 由 ASCII 字符组成
boolisPalindrome1(string s){int left =0;int right = s.length()-1;while(left < right){char leftCh = s[left];if(!std::isalnum(leftCh)){left++;continue;}char rightCh = s[right];if(!std::isalnum(rightCh)){right--;continue;}// 左右字符都转换成大写字母if(std::toupper(leftCh)!= std::toupper(rightCh)){returnfalse;}left++;right--;}returntrue;}
优化写法:
先遍历字符串中所有字符,转成小写
在while循环中,继续使用while循环过滤非字母和数字的字符,接着直接判断是否相等
boolisPalindrome(string s){for(int i =0; i < s.length(); i++){s[i]= std::tolower(s[i]);}int left =0;int right = s.length()-1;while(left < right){while(left < right &&!std::isalnum(s[left])){left++;}while(left < right &&!std::isalnum(s[right])){right--;}// 左右字符都转换成大写字母if(s[left]!= s[right]){returnfalse;}left++;right--;}returntrue;}
3、LCR 019. 验证回文串 II
题目信息:
https://leetcode.cn/problems/RQku0D/description/
给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。示例 1:
输入: s ="aba"
输出:true示例 2:
输入: s ="abca"
输出:true
解释: 可以删除 "c" 字符 或者 "b" 字符示例 3:
输入: s ="abc"
输出:false提示:
1<= s.length <=105
s 由小写英文字母组成
// 计算回文子串的个数intcountPalindorm(std::string s,int start,int end){int count =0;while(start >=0&& end < s.length()){if(s[start]!= s[end]){break;}start--;end++;count++;}return count;}intcountSubstrings(string s){std::cout <<"s:"<< s << std::endl;int res =0;for(int i =0; i < s.length(); i++){res +=countPalindorm(s, i, i);res +=countPalindorm(s, i, i +1);}return res;}