碰到了好几次回文判断的题目,这一次下定决心解决了
我首先想到的问题是,从第一个开始,一直往后判断,判断的方法是用一个二维数组,记录两个点,匹配成功以后,就一直向里,直到两个碰面,记录数组的下标,遍历完成以后,完成输出(暴力法)
#include<iostream>
using namespace std;
string longestPalindrome(string &s)
{
int len = s.size(); //字符串长度
int maxlen = 0; //最长回文字符串长度
int start = 0; //最长回文字符串起始地址
for(int i = 0; i < len; i++) //起始地址
{
for(int j = i + 1; j < len; j++) //结束地址
{
int tmp1 = i, tmp2 = j;
while(tmp1 < tmp2 && s.at(tmp1) == s.at(tmp2))//判断是不是回文
{ cout<<s[tmp1]<<" "<<s[tmp2]<<endl;
tmp1++;
tmp2--;
}
if(tmp1 >= tmp2 && j - i + 1 > maxlen)
{
maxlen = j - i + 1;
start = i;
}
}
}
cout<<"最长的回文数"<<(maxlen-start)<<endl;
return s.substr(start, maxlen);
}
int main()
{
string s;
cout << "输入匹配字符串";
getline(cin,s);
cout << "最长的匹配数组是: " << longestPalindrome(s);
return 0;
}
还有一种方法是从中间遍历(空格也算,你可以用一个if判断去掉空格)
#include<iostream>
#include<string>
using namespace std;
string longestPalindrome(string& s)
{
int len = s.size(); //字符串长度
int maxlen = 0; //最长回文字符串长度
int start = 0; //最长回文字符串起始地址
int maxlen1=0, start1=0;
int sum = 0;
for (int i = 0; i < len; i++) //起始地址
{
for (int j = i + 1; j < len; j++) //结束地址
{
int tmp1 = i, tmp2 = j;
while (tmp1 >= 0 && tmp2 < len && s.at(tmp1) == s.at(tmp2))//判断是不是回文
{
cout << s[tmp1] << " " << s[tmp2] << endl;
tmp1--;
tmp2++;
start = tmp1;
maxlen = tmp2;
}
if ((maxlen - start) > sum)
{
sum = maxlen - start;
maxlen1 = maxlen;
start1 = start;
}
}
}
cout << "最长的回文数" << sum-1 << endl;
//return s.substr(start, maxlen);
return s.substr(start1+1, maxlen1);
}
int main()
{
string s;
cout << "输入匹配字符串";
getline(cin, s);
cout<<"匹配的字符串"<<longestPalindrome(s);
return 0;
}
好了,就介绍到这里,算法的时间复杂度都是n的三次方。
本文深入探讨了回文字符串的两种常见判断算法:暴力法和中间遍历法,并提供了详细的C++实现代码,旨在帮助读者理解和掌握回文字符串的判断技巧。

294

被折叠的 条评论
为什么被折叠?



