這是一個檢查迴文子串的簡單程序。 它適用於長度爲1000的字符串,但在SPOJ上的長度爲100000時發生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;
}
如何你寫你的算法下的英語嗎?如果你可以用英語(或你的母語)來描述它,你會發現很容易看出爲什麼它會變得很慢。 – UKMonkey
寫回文檢查功能。將其應用於每個子字符串而不保存它們。 – molbdnilo
imho要求檢查單字母變量名稱的代碼只是...不好。無論如何審查有https://codereview.stackexchange.com/,但我不希望這將得到很好的收到那裏或 – user463035818