标签:rac asc using har 大小 algo and erro www
https://leetcode.com/problems/valid-palindrome/
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
1、普通思路
把数字和字符提取出来,然后如果是字母就转换为小写。加到新的字符串中。
对于这个新的字符串,使用一个多条件循环,分别从字符串头、字符串尾遍历字符串的中间值,如果不一致就退出。直到遍历结束还是一致就判定为回文字符串。
2、高级思路
在discuss看到的答案。
用一个大循环分别从字符串头、字符串尾遍历字符串的中间值,里面两个小循环,用isalnum()函数判断是不是字母数字,如果不是就向前移动指针。
https://leetcode.com/problems/valid-palindrome/discuss/119173/C++-Easy-to-Understand-Solution
第一种方案:
先判断是否为数字字母,跟之前写的to-lower-case结合,把大写转换为小写。
#include<stdio.h>
#include <string>
using std::string;
class Solution {
public:
bool isPalindrome(string s) {
string re_val = "";
// 除去特殊符号,提取出字符串的小写字母
for (char str_val : s)
{
// 确认字母数字
if (isalnum(str_val) != false)
{
if (str_val >= 'A'&& str_val <= 'Z')
{
// 取小写与大写之间的差值,得到字符对应的小写ASCII码对应是什么存进字符串中
re_val += (str_val + ('a' - 'A'));
}
else
{
// 如果是小写就不处理
re_val += str_val;
}
}
}
for (int i=0,j=re_val.size()-1; i<j;i++,j--)
{
//一个指针从左边指到右边,一个指针从右边指向左边。如果有不同的值,就判断不是回文字符。
if (re_val[i] != re_val[j])
return false;
}
return true;
}
};
int main()
{
Solution solu;
bool ret;
ret = solu.isPalindrome("A man, a plan, a canal: Panama");
printf("%d \n", ret);
ret = solu.isPalindrome("race a car");
printf("%d \n", ret);
return 0;
}
第二种方案:
bool isPalindrome(string s) {
for (int i = 0, j = s.size() - 1; i < j; i++, j--) { // Move 2 pointers from each end until they collide
while (isalnum(s[i]) == false && i < j) i++; // Increment left pointer if not alphanumeric
while (isalnum(s[j]) == false && i < j) j--; // Decrement right pointer if no alphanumeric
if (toupper(s[i]) != toupper(s[j])) return false; // Exit and return error if not match
}
return true;
}
标签:rac asc using har 大小 algo and erro www
原文地址:https://www.cnblogs.com/17bdw/p/10358170.html