Valid Palindrome

来源:互联网 发布:北大外国语学院知乎 编辑:程序博客网 时间:2024/04/29 02:55

题目

这里写图片描述


题意

判断字符串是否为回文。
例如:
“A man , a plan , a canal : Panama” 这个是回文(amanaplanacanalpanama)。
“race a car”这不是回文。
字符串中我们只关注字符为字母的,忽略其他类型的字符。
注意:要求一次遍历,不开辅助空间。
函数形式


思路

因为要一次遍历,可以利用双指针的原理,从字符串的头尾开始向中间遍历,声明low和high,作为数组的下标,每次进行一次判断,如果该字符不是字母或数字就移动指针,low++或者high–;如果是字母或者字符就判断头尾的两字符是否相等,若不相等就返回false,相等则继续移动指针,这是low++,high–同时进行。
直到low和high相等,即将数组遍历完后,这是就证明数组中满足要求的字符都遍历完了且相等,即为回文,返回true。


代码

bool isPalindrome(char* s){    int len=strlen(s);    int low=0,high=len-1;    while (low<high)//当low=high时数组就遍历完了    {        if ((s[low]>='a' && s[low]<='z') || (s[low]>='A' && s[low] <= 'Z') || (s[low] >='0' && s[low] <='9'))//判断是否为字母或者字符        {            if ((s[high]>='a' && s[high]<='z') || (s[high]>='A' && s[high]<='Z') || (s[high]<='9' &&s[high] >= '0'))            {                    if (tolower(s[low]) != tolower(s[high]))//转化成小写字母比较,若不相等就返回false,不是回文                    {                        return false;                    }                    else//若相等则继续比较                    {                        low++;                        high--;                    }            }            else//尾部的字符不满足字符或者数字的,将指针向前移            {                high--; continue;            }        }        else//头部的字符不满足的,将指针想后移        {            low++; continue;        }    }    return true;//数组遍历完即证明是回文}

总结

1.表头文件
#include<stdlib.h>

tolower(将大写字母转换成小写字母)
定义函数 int tolower(int c);
函数说明 若参数c为大写字母则将该对应的小写字母返回。
返回值 返回转换后的小写字母,若不须转换则将参数c值返回。

函数名: toupper
功 能: 把字符转换成大写字母
用 法: int toupper(int c);

2.注意双指针的应用,并不是真的指针,只是代表数组下标,根据情况移动数组的下标,并通过这个下标读取数组中的数据,从头尾同时向中间移动,实现一次遍历。

3.还要注意判断条件的放置,最开始的时候我是对满足条件的字符进行处理,反而要考虑很多情况,且布局很乱,其实从没有满足就怎样的角度来做反而要简单些,即不是字母或者字符就移动指针,是就比较,不相等就返回false,终止。相等就继续。

4.注意加上continue语句,因为不满足字母或数字时,每次只移动一个指针,low或者high,谁不满足就移动谁,只有都满足且相等才能同时移动。


0 0
原创粉丝点击