验证回文串
说明:回文串是一个正读和反读都一样的字符串,我们将空字符串定义为有效的回文串。
示例:输入: "level", 输出: true。
最基本的回文串问题,可以用双指针分别由前往后检索和由后往前检索,如果最后相遇则是回文串。可以利用一个栈来通过压入前半段,来判断后半段;或者全部压入,再与字符串从后往前比较。也可以利用递归的来做,与双指针的思想实际一模一样。
代码如下:
#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
//双指针
bool isPalindrome1(char* s){
int left = 0; //左指针
int len = strlen(s); //字符串长度
int right = len - 1; //右指针
/*
while循环终止条件:
串是回文串并且长度为偶数:最终 left > right
串是回文串并且长度为奇数:最终 left = right
*/
while(left < right){
//不对称返回false
if(s[left] != s[right]) return false;
else{
left ++; //左指针右移
right --; //右指针左移
}
}
return true; //while结束后返回true
} //时间复杂度O(n) 空间复杂度O(1)
//栈1
bool isPalindrome2(char* s){
stack<int> st;
int i;
int len = strlen(s);
//前一半压入栈
for(i = 0;i < len/2;i ++)
st.push(s[i]);
//偶数串奇数串找后半串方式不同
i = len%2 == 0 ? len/2 : len/2 + 1;
while(i < len){
if(s[i] == st.top())
st.pop();
else return false;
i++;
}
return true;
} //时间复杂度O(n) 空间复杂度O(n)
//递归
bool isPalindrome3(char* s,int left,int right){
//递归的终止条件,两个表达式分别代表奇数串和偶数串的终止条件
if(left == right || left > right) return true;
//不对称返回false,对称则进入下一层递归
else
return s[left] == s[right] ? isPalindrome3(s,left+1,right-1) : false;
} //时间复杂度O(n) 空间复杂度O(1)
//栈2
bool isPalindrome4(char* s){
int len = strlen(s);
int i=0;
stack<int> st;
for(int i=0;i<len;i++)
st.push(s[i]);
for(int i=0;i<len;i++)
if(s[i] == st.top())
st.pop();
else return false;
return true;
}//时间复杂度和空间复杂度不及栈1,也是时间复杂度O(n) 空间复杂度O(n)
int main(){
char *str1 = "levael";
char *str2 = "levvel";
cout<<"双指针:"<<endl;
cout<<"str1:"<<isPalindrome1(str1)<<endl;
cout<<"str2:"<<isPalindrome1(str2)<<endl;
cout<<"栈:"<<endl;
cout<<"str1:"<<isPalindrome2(str1)<<endl;
cout<<"str2:"<<isPalindrome2(str2)<<endl;
cout<<"递归:"<<endl;
cout<<"str1:"<<isPalindrome3(str1,0,5)<<endl;
cout<<"str2:"<<isPalindrome3(str2,0,5)<<endl;
}
运行结果: