当前位置 : 主页 > 手机开发 > ROM >

返回字符串的最长回文串

来源:互联网 收集:自由互联 发布时间:2021-06-10
//暴力求解 /*判断字符串所有的长度大于1的字串是否为回文串 若字符串长度过长 耗时较长 时间复杂度O(n^3) 找出所有的字符串0(n^2),每一个判断耗时O(n) //判断是否为回文串的函数 b

//暴力求解   

/*判断字符串所有的长度大于1的字串是否为回文串    若字符串长度过长   耗时较长

时间复杂度O(n^3)   找出所有的字符串0(n^2),每一个判断耗时O(n)   

//判断是否为回文串的函数

bool isPalindrome(string s){
string str;
str = s;
reverse(s.begin(),s.end());
if(s==str)
return true;
else
return false;
}

//返回最长的子串下标
int longestIndex(vector<string> s)
{ int index =0;
int max =s[0].length();
for(int i =1;i<s.size();++i)
if(max<s[i].length())
{
max=s[i].length();
index =i;
}
return index;
}
string  longestPalindrome(string s) {
vector<string> str1;
if(s=="")str1.push_back("");
string s1 ="";

for(int i = 0;i<=s.length();++i)
{
for(int j = 1;j<=s.length()-i;++j)
{
s1=s.substr(i,j);//获取s的子串
if(isPalindrome(s1))//判断子串是否为回文串
{
str1.push_back(s1);//  存进vector str1;
}
}
}
return str1[longestIndex(str1)];
}

//动态规划

我们定义P{i,j}为字符串从i到j的子字符串;

P{i,j} =true   表示该字串为回文串,false 则不是

初始化p{i,i} =true;

当S[i] =s[i+1] 则P{i,i+1}=true;

若P{i,j}为true  且S[i+1]==S[j-1] p{i+1,j-1}也为true

如此空间复杂度度为O(n^2)  时间复杂度也为O(n^2)

string longestPalindrome(string s) {
if(s == "" || s.length() == 1){
return s;
}
bool p[1005][1005] ;
int start = 0;//跟踪最长回文串的初始位置
int maxlen =1;//返回值最长回文串的长度
int len =s.length();
for(int i =0;i<len;i++)
{
p[i][i] =true;
if(i<len-1 &&s[i]==s[i+1]){
p[i][i+1] =true;
start = i;
maxlen = 2;
}

}

for(int m =3;m<=len;m++){
for(int i = 0;i<=len-m;i++){
int j = i+m-1;
if(p[i+1][j-1] && s[i] == s[j])
{ p[i][j] = true;
start =i;
maxlen =m;
}

}}return s.substr(start,maxlen);}

网友评论