leetcode

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是否相等,若相等表明是回文串,否则不是

代码:

 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 */
View Code

这个思路简单、直接,但不是特别好,时间消耗O(n),空间消耗O(n),其实可以省去空间消耗,思路如下:

1,先将原串中的字母转成小写

2,然后设置两个指针,一个指向头,一个指向尾,若头尾指针都指向的数字或者字母(当某个指针指向其它字符,则跳过该字符,指向下一个字符,直到指向的是数字或者字母),就进行比较,相同则两个指针同时往中间走一步,直到头尾指针相遇,此时说明该串为回文串,若在比较过程中出现一次不同,则说明该串不是回文串

代码:

 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 };
View Code
原文地址:https://www.cnblogs.com/laihaiteng/p/3960227.html