Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
For example,"A man, a plan, a canal: Panama"
is a palindrome."race a car"
is not a palindrome.
Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.
For the purpose of this problem, we define empty string as valid palindrome.
回文串的判定,只关注数字和字母即可
个人思路:
1,构造一个新的字符串s1,它只包含原串的字母和数字,且字母都转成小写
2,再构造一个字符串s2,它是s1的反转字符串
3,判断s1和s2是否相等,若相等表明是回文串,否则不是
代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <string> 2 //#include <cctype> 3 //#include <iostream> 4 5 using namespace std; 6 7 class Solution { 8 public: 9 bool isPalindrome(string s) { 10 if (s.empty()) 11 { 12 return true; 13 } 14 15 string s1(""); 16 17 for (int i = 0; i < s.length(); ++i) 18 { 19 if (s[i] <= '9' && s[i] >= '0') //数字 20 { 21 s1.insert(s1.end(), s[i]); 22 } 23 else if (s[i] <= 'Z' && s[i] >= 'A') //大写字母 24 { 25 s1.insert(s1.end(), tolower(s[i])); 26 } 27 else if (s[i] <= 'z' && s[i] >= 'a') //小写字母 28 { 29 s1.insert(s1.end(), s[i]); 30 } 31 } 32 33 string s2(""); 34 35 for (int i = s1.length() - 1; i >= 0; --i) 36 { 37 s2.insert(s2.end(), s1[i]); 38 } 39 40 if (!s1.compare(s2)) 41 { 42 return true; 43 } 44 else 45 { 46 return false; 47 } 48 } 49 }; 50 /* 51 int main() 52 { 53 string s("A man, a plan, a canal: Panama"); 54 55 Solution so; 56 cout << so.isPalindrome(s) << endl; 57 58 system("pause"); 59 60 return 0; 61 } 62 */
这个思路简单、直接,但不是特别好,时间消耗O(n),空间消耗O(n),其实可以省去空间消耗,思路如下:
1,先将原串中的字母转成小写
2,然后设置两个指针,一个指向头,一个指向尾,若头尾指针都指向的数字或者字母(当某个指针指向其它字符,则跳过该字符,指向下一个字符,直到指向的是数字或者字母),就进行比较,相同则两个指针同时往中间走一步,直到头尾指针相遇,此时说明该串为回文串,若在比较过程中出现一次不同,则说明该串不是回文串
代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <string> 2 3 using namespace std; 4 5 class Solution { 6 public: 7 bool isPalindrome(string s) { 8 if (s.empty()) 9 { 10 return true; 11 } 12 13 for (string::iterator it = s.begin(); it != s.end(); ++it) 14 { 15 *it = tolower(*it); 16 } 17 18 string::iterator head = s.begin(), tail = prev(s.end()); 19 20 while(head < tail) 21 { 22 if (!isalnum(*head)) 23 { 24 ++head; 25 } 26 else if (!isalnum(*tail)) 27 { 28 --tail; 29 } 30 else if(*head != *tail) 31 { 32 return false; 33 } 34 else 35 { 36 ++head; 37 --tail; 38 } 39 40 } 41 42 return true; 43 } 44 };