我在打印最长的回文子字符串的输出时遇到了问题,并且还没有弄清楚。如果输入的是一个回文字符串,我的代码会打印出一个回文字符串,但不能打印出回文子字符串。这段代码的else函数有问题,我想知道bug在哪里:
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;
}提前感谢所有能提供帮助的人
发布于 2020-06-15 06:54:22
问题出现在最里面的循环中。
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;
}
}我认为您正在尝试将子字符串的每个字符与另一边的字符进行比较。这种方法是正确的,如果正确实现,将会起作用。
但是,循环只比较字符串最左端和最右端的字符(strk和strj),这意味着它几乎总是忽略字符串中的大多数字符。
下面是我的代码,它实现了这种方法:
#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;
}https://stackoverflow.com/questions/62378903
复制相似问题