描述
给定一个字符串,请编写一个函数判断该字符串是否回文。如果回文请返回true,否则返回false。
回文串定义为一个正读和反读都一样的字符串,例如“aooa”,“a”等。
易知长度为0的字符串必定不为回文串,长度为1的字符串必定为回文串。
当字符串长度大于1时,可以有以下几种解法:
解法1: 判断 是否成立
进行次判断,如果出现一次 ,该字符串就不是回文串,如果所有判断全都相等,那么该字符串是回文串。时间复杂度:,空间复杂度:。
核心代码:
class Solution { public: bool judge(string str) { // write code here int n=str.length(); //获取字符串长度 if(n==0){ return false; } else if(n==1){ return true; } for(int i=0;i<n/2;i++){ //使用for循环进行逐一比较 if(str[i]!=str[n-i-1]){ return false; } } return true; } };
解法2: 双指针法
使用两个指针分别指向字符串两端的字符,指针分别向后及向前移动,移动同时比较两个指针所指向的值是否相同,若不相同时则表示此字符串不是回文串;若两指针相遇时未出现不相同的字符,那么该字符串就是回文串。时间复杂度:,空间复杂度:。
举个例子,对于“abba”这个字符串进行判断的时候,指针的判断顺序是这样的:
另一个例子是“abca”:
核心代码:
class Solution { public: bool judge(string str) { // write code here int n=str.length(); if(n==0){ return false; } else if(n==1){ return true; } int left=0; //定义左端指针 int right=n-1; //右端指针 while(left<right&&left!=right){ //使用指针逐一向后及向前扫 if(str[left]==str[right]){ left+=1; right-=1; } else{ //如遇到指针所指向的字符不相等,那么该字符串就不是回文串 return false; } } //所有比较结束,为找到不相同字符,该字符串为回文串 return true; } };