目录
题目要求
代码实现
题目要求
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
示例 1:
输入: s = "A man, a plan, a canal: Panama" 输出:true 解释:"amanaplanacanalpanama" 是回文串。示例 2:
输入:s = "race a car" 输出:false 解释:"raceacar" 不是回文串。示例 3:
输入:s = " " 输出:true 解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。 由于空字符串正着反着读都一样,所以是回文串。
代码实现
代码演示:
bool isalnum(char ch) //判断字符是否是字母或者数字
{if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' ||ch >= '0' && ch <= '9'){return true;}else{return false;}
}char tolower(char ch) //将大写字母转换成小写字母
{if (ch >= 'A' && ch <= 'Z')return ch + 32;elsereturn ch;
}bool isPalindrome(char* s)
{int left = 0;int right = strlen(s) - 1;while (left < right){// 非字母或者数字时:while (left < right && !isalnum(s[left]))left++;while (right > left && !isalnum(s[right]))right--;if (left < right){if (tolower(s[left]) != tolower(s[right]))return false;}left++;right--;}return true;
}
代码解析:
利用 isalnum 函数跳过非字母非数字的字符,需要注意的是:当 s 字符串中全是非字母非数字的字符时,所以要加上 left < right 和 right > left 的判断
再利用 tolower 函数将各自的大写字母转换为小写字母,当 tolower 函数判断为小写字母或者数字时就会直接返回,s[left] 和 s[right] 比较后,不相等就说明不是回文串
当 while 循环走完后,那么 s 就是回文串
代码验证:
算法的时间和空间复杂度:
while(left < right) 最好的情况时执行 longN 次,但内部有两个 while 循环 ,所以要看最坏的情况,最坏的情况执行了 N 次,且没有开辟额外的空间,得:
时间复杂度:O(N)
空间复杂度:O(1)