时限超过C ++

时间:2018-08-29 07:45:00

标签: c++

代码是查找字符串中最长的回文子字符串。判断的时限超过了在线系统。系统给我以下反馈:

  

上次执行的输入:

     

“cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccc“

但是我在本地测试了此输入,发现没有错误。我的代码有什么问题?

bool isPalindromic(string s){
    for(int i=0;i<s.size();i++){
        if(s[i]!=s[s.size()-i-1]) return false;
    }
    return true;
}
string longestPalindrome(string s) {
    string result;
    int maxi=0,l=0;
    int p;
    for(int p=0;p<s.size();p++){
        for(int i=p;i<s.size();i++){
            string current = s.substr(p,i-p+1);
            if(isPalindromic(current)){
                if(current.size()>maxi){
                    result=current;
                    maxi=current.size();
                }
            }
        }
    }
    return result;
}
int main(){
  string s="ccc";
  string a=longestPalindrome(s);
  cout<<a;
}

2 个答案:

答案 0 :(得分:0)

这是一种不那么残酷的解决方案。我相信它可能会更有效率。它试图通过在较短的字符串之前先检查所有较长的字符串来避免冗余。

#include <string>
#include <algorithm>
#include <iostream>

template<class T>
bool isPalindromic(T&& s){
    return std::equal(std::begin(s), std::end(s), std::rbegin(s));
}

std::string longestPalindrome(std::string s) {
    auto max = s.length();
    auto sub = std::string();
    for(auto len = max ; len > 1 ; --len)
    {
        for(auto pos = 0 ; pos + len <= max ; ++pos)
        {
            auto sub = s.substr(pos, len);
            if (isPalindromic(sub))
                return sub;
        }
    }
    return s.substr(0, 1);
}

int main(){
    std::cout << longestPalindrome("ccccccccccccccccccccccc") << '\n';
    std::cout << longestPalindrome("4353543543543543543dfdfdfdsfdfdsfdsfdsrdvdffdfmonkeyyeknom738trfgsdcvsdjhcvskcjisfucjvsukcjmvesukcjvewckuyvskjvsjhc,es") << '\n';
}

答案 1 :(得分:0)

此在线系统(项目Euler,Hackerrank等)设置了一些时间限制,您的代码需要完成这些时间才能完成任务。您的代码太慢。通常,这意味着您需要寻找更快的(较低复杂度的算法)。

特别是,您的代码是二次复杂的(以isPalindromic()调用的数量为单位),查看每个可能的子字符串。有很多冗余-例如如果从i开始到j结束的子串不是回文,那么您根本不需要检查子串(i-1,j + 1),因为它显然也不是回文。

您需要提出一种更智能的算法。