【数据结构·考研】验证回文串

验证回文串

说明:回文串是一个正读和反读都一样的字符串,我们将空字符串定义为有效的回文串。
示例:输入: "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;
} 

运行结果:

猜你喜欢

转载自blog.csdn.net/cjw838982809/article/details/108071864