回文串,这是一个面试中经常见到会考到的一个面试题,什么叫回文串呢,通俗直白的意思就是一个字符串倒序与正序是完全一样的,这就叫回文串。
1:输入一个字符串,判断这个字符串是不是回文件字符串?
解:每一个学习程序设计语言的人,拿的第一本教程里面应该都会有这个题目:),看看程序代码吧,思想就是两头元素逐个比较,如不等,则不是回文串中。
程序代码:(时间复杂度为O(n),空间复杂度为0)
bool palinDrome(char *str)
{
for(int i=0;i<strlen(str)/2&&(str[i]==str[strlen(str)-i-1]);i++);
return (i==strlen(str)/2)?true:false;
}
上面的代码已经很短了,你可以自已试试,变的更短
2:输入一个字符串,判断字符串里面是否含有回文字符串?
程序代码:(时间复杂度为O(n),空间复杂度为0)
//回文字符从中间向两头的任意子串均是回文串
bool palinDrome(char *str)
{
for(int i=0;i<strlen(str)-1;i++)
if(str[i]==str[i+1]||(i-1)>0&&str[i-1]==str[i+1]?true:false)
return true;
return false;
}
3:输出一个字符串里面的最长回文字串(复杂度为O(n^2),据说后缀树可以达到O(n),懒得想了:))
此算法是在上述算法2的基础上整理而来
#include<iostream>
#include<iterator>
#include<algorithm>
using namespace std;
void palinDrome(char *str)
{
int len=strlen(str),i,j;
int cnt=1,max=0,index=0;
for(i=0;i<len-1;i++)
{
if(str[i]==str[i+1])//处理偶数的情况下
{
++cnt;
for(j=1;j<=i&&j<=len-i-2;j++)
if(str[i-j]==str[i+j+1])
cnt+=2;
else break;
}
else
{
for(int j=1;j<=i&&j<=len-i-1;j++)//处理奇数的情况下
if(str[i-j]==str[i+j])
cnt+=2;
else
break;
}
if(cnt>max)
max=cnt,index=i-j+1;
cnt=1;
}
if(max>1)
copy(str+index,str+index+max,ostream_iterator<char>(cout,""));
}