LeetCode 125
Valid Palindrome
Problem Description:
判断给出的字符串是否是有效的回文字符串。
具体的题目信息:
https://leetcode.com/problems/valid-palindrome/description/Solution:
- 解题思路:用两个变量
i
和j
从字符串两端向中间移动,比较两个变量指向的字符
(1)如果两个变量指向的字符都是字母,必须是同个字母或者同个字母的大小写
(2)如果两个变量指向的字符都是数字,必须是同个数字
(3)如果两个变量指向的字符是不同类型的,必须保证不能一个指向字母,一个指向数字,正确的情况如下:
- 一个指向字母,一个必须指向标点符号或者空格
- 一个指向数字,一个必须指向标点符号或者空格
- 编程实现:
- 解题思路:用两个变量
class Solution {
public:
bool isPalindrome(string s) {
if (s == "") return true;
int i = 0, j = s.size()-1;
while(i <= j) {
//若对应位置的字符都是字母,必须是同个字母的大小写才返回true,否则返回false
if (isCharacter(s[i])&&isCharacter(s[j])) {
if (s[i]+32 == s[j]||s[i]-32 == s[j]||s[i] == s[j]) {
i++;
j--;
} else {
return false;
}
} else if (isNumber(s[i])&&isNumber(s[j])) {
//若对应位置的字符都是数字,必须是同个数字才返回true,否则返回false
if (s[i] == s[j]) {
i++;
j--;
} else {
return false;
}
} else {
//若字符既不是字母也不是数字,前进(后退)一位
if (!isCharacter(s[i])&&!isNumber(s[i])) {
i++;
} else if (!isCharacter(s[j])&&!isNumber(s[j])) {
j--;
} else if (isCharacter(s[i])) {
//若对应位置的两个字符一个是数字,一个是字母,返回true,否则将不是数字或字母的位置向前(后)移动一位
if (isNumber(s[j])) {
return false;
}
j--;
} else if (isCharacter(s[j])) {
if (isNumber(s[i])) {
return false;
}
i++;
}
}
}
return true;
}
//判断字符是否字母
bool isCharacter(char i) {
if ((i>='a'&&i<='z')||(i>='A'&&i<='Z'))
return true;
return false;
}
//判断字符是否数字
bool isNumber(char i) {
if (i>='0'&&i<='9')
return true;
return false;
}
};