最长的回文子串(C++帮助)

  • 本文关键字:C++ 帮助 子串 回文 c++
  • 更新时间 :
  • 英文 :


我在打印最长回文子字符串的输出时遇到问题,还没有弄清楚。如果输入是回文字符串,我的代码会打印出回文,但无法打印出回文子字符串。此代码的 else 函数有问题,想知道错误在哪里:

string longestSubstring(string str){
int size = str.size();
string newStr = "";
if(str[0] == str[size - 1]){
for(int i = size - 1;i >= 0;i--){
newStr += str[i];
}
if(str == newStr){
return newStr;
}
}
else{
for(int j = 0; j < size - 1; j++){
for(int k = size - 1; k > 0; k--){
if(str[j] == str[k] && k != j){
for(int i = size - 1;i > 0;i--){
newStr += str[i];
}
}
k = 0;
j = size;
}
}
}
return newStr;
}
int main() {
string palindromeStr;
cout << longestSubstring(palindromeStr);  
return 0;
}

提前感谢任何能够提供帮助的人

问题出现在最里面的循环中。

for(int j = 0; j < size - 1; j++){
for(int k = size - 1; k > 0; k--){
if(str[j] == str[k] && k != j){
for(int i = size - 1;i > 0;i--){
newStr += str[i];
}
}
k = 0;
j = size;
}
}

我认为您正在尝试将子字符串的每个字符与另一侧的字符进行比较。这种方法是正确的,如果实施得当,就会起作用。

但是,循环只比较字符串最左端和最右端的字符(str[k] 和 str[j](,这意味着它几乎总是省略字符串中的大多数字符。

这是我的代码,它实现了该方法:

#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
bool isPalindrome(string str){
for(int i = 0; i <= str.size()/2; ++i){
if(str[i] != str[str.size()-1-i]){return false;}
}
return true;
}
string longestSubstring(string str){
int len = str.size();
for(int size = len; size >= 1; --size){ // test every possible size
for(int start = 0; start < len-size; ++start){
if(isPalindrome(str.substr(start, size))){
return str.substr(start, size);
}
}
}
return "";
}
int main() {
string palindromeStr;
cin >> palindromeStr;
cout << longestSubstring(palindromeStr);  
return 0;
}

最新更新