C++ 减少检查字符串的子字符串是否为回文的时间复杂性

C++ 减少检查字符串的子字符串是否为回文的时间复杂性,c++,string,time-complexity,palindrome,C++,String,Time Complexity,Palindrome,这是一个简单的程序,用于检查回文子字符串。 对于长度为1000的字符串,它可以正常工作,但对于长度为100000的SPOJ,它会产生TLE错误。如何优化此代码。保存所有子字符串对于如此大的输入不起作用。时间限制为1秒,因此我们最多可以进行10^6-10^7次迭代。我还有别的办法吗 #include<bits/stdc++.h> int main() { int t; std::cin>>t; if(t<1||t>10)

这是一个简单的程序,用于检查回文子字符串。 对于长度为1000的字符串,它可以正常工作,但对于长度为100000的SPOJ,它会产生TLE错误。如何优化此代码。保存所有子字符串对于如此大的输入不起作用。时间限制为1秒,因此我们最多可以进行10^6-10^7次迭代。我还有别的办法吗

#include<bits/stdc++.h>

int main()
{
    int t;
    std::cin>>t;
    if(t<1||t>10)
        return 0;
    while(t--)
    {
        std::string s;
        std::cin>>s;
        //std::cout<<s.substr(0,1);
        //std::vector<std::string>s1;
        int n=s.length();
        if(n<1||n>100000)
            return 0;
            int len,mid,k=0,i=0;
        for(i=0;i<n-1;i++)
        {
            for(int j=2;j<=n-i;j++)
            {
                std::string ss=s.substr(i,j);
                //s1.push_back(ss);
            len=ss.length();
            mid=len/2;
            while(k<=mid&&(len-1-k)>=mid&&len>1)
            {
                if(ss[k]!=ss[len-1-k])
                    break;
                k++;
            }
            if(k>mid||(len-1-k)<mid)
            {
                std::cout<<"YES"<<std::endl;
                break;
            }
            }
            if(k>mid||(len-1-k)<mid)
                break;
        }

        if(i==n-1)
            std::cout<<"NO"<<std::endl;
            //for(i=0;i<m;i++)
              //  std::cout<<s1[i]<<std::endl
    }
    return 0;
}
#包括
int main()
{
int t;
标准:cin>>t;
if(t10)
返回0;
而(t--)
{
std::字符串s;
标准:cin>>s;

//std::cout我不完全确定您的函数试图实现什么…您是否正在查找回文子字符串

要节省内存,而不是将每个子字符串存储在
向量中,然后在
向量上迭代以检查回文,为什么不在生成子字符串时检查子字符串是否为回文

std::string ss = s.substr(i,j);
// s1.push_back(ss);  // Don't store the substrings
if (palindromic(ss)) {
    std::cout << "YES" << std::endl;
    break;
}
std::string ss=s.substr(i,j);
//s1.向后推(ss);//不存储子字符串
if(回文(ss)){

std::cout您假设将所有子字符串保存在另一个向量中,然后使用相同的O(N^2)方法检查它们,这无助于降低算法的时间复杂度。相反,这也会增加内存复杂度。将所有可能的子字符串保存在另一个向量中会占用大量内存

由于字符串的最大大小可能为10^5。要检查是否存在任何回文子字符串,应在O(NlogN)O(N)时间复杂度中执行,以便在时间限制内通过。为此,我建议您使用两种算法:
1.)后缀数组:链接

2.)马纳彻算法:Link

你用英语写下你的算法怎么样?如果你能用英语(或你的母语)描述的话你会发现,更容易理解为什么它进展缓慢。编写一个回文检查函数。将其应用于每个子字符串,而不保存它们。我认为要求仅使用单字母变量名称来检查代码是……不好的。无论如何,检查是有的,尽管我不希望这会在那里受到欢迎either@tobi303这次行动需要改写一下。只要“这是我的代码。它通过Y&Z实现了X。我怎样才能使它更快?”。至于代码太糟糕,这对我们来说真的不是问题。只要它按预期工作,我们很乐意检查它。字符串的子字符串数是(n^2+n)/2,因此算法需要O(n^2)时间我们该如何在O(nlogn)或O(n)中进行。无论如何,谢谢你的帮助