我想在字串中列印最長的回文,我已經撰寫了代碼,但這對某些測驗用例給出了錯誤的答案。我無法在我的代碼中找到錯誤。任何人都可以幫助我,Anyhelp 將不勝感激。
輸入
vnrtysfrzrmzlygfv
輸出
v
預期產出
rzr
代碼:
class Solution {
public:
int ispalindrome(string s)
{
string rev = "";
int n = s.size();
for (int i = n - 1; i >= 0; i--) {
rev = rev s[i];
}
if (rev == s) {
return 1;
}
return 0;
}
string longestPalin(string S)
{
// code here
int size = S.size();
int size_of_substr = 0;
string ans;
for (int i = 0; i < size; i ) {
for (int j = i 1; j < size; j ) {
string s2 = S.substr(i, j);
if (ispalindrome(s2)) {
if (s2.size() > size_of_substr) {
ans = s2;
size_of_substr = s2.size();
}
else {
continue;
}
}
else {
continue;
}
}
}
return ans;
}
};
uj5u.com熱心網友回復:
您使用substr(.)不正確。第二個引數是子字串的大小。
string s2 = S.substr(i, j);應該替換為string s2 = S.substr(i, j-i 1);
而且,這段代碼效率不會很高。為了加快速度,我通過以下方式修改了您的代碼:
- 我通過參考
ispalindrome函式來傳遞字串 - 我修改了演算法來檢查子字串是否是回文。它
false在第一次不匹配后回傳 - 我沒有明確地構建每個子字串。我只將子字串的開頭和開頭傳遞給輔助函式
- 我首先檢查是否存在最大大小的回文,然后減小它的長度。一旦找到回文,我們就知道它有最大的大小,我們可以停止搜索
#include <iostream>
#include <string>
class Solution {
public:
int ispalindrome(const std::string& S, int i, int j) {
while (i < j) {
if (S[i ] != S[j--]) return 0;
}
return 1;
}
std::string longestPalindrome(const std::string& S) {
int size = S.size();
int imax = 1;
for (int size_of_substr = size; size_of_substr > 0; size_of_substr--, imax ) {
int j = size_of_substr - 1;
for (int i = 0; i < imax; i , j ) {
if (ispalindrome(S, i, j)) {
std::string ans = S.substr(i, size_of_substr);
return ans;
}
}
}
return "";
}
};
int main() {
Solution sol;
std::string S;
std::cin >> S;
auto ans = sol.longestPalindrome(S);
std::cout << ans << "\n";
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/437757.html
