[英]1772 of Caribbean online judge giving a time limit exceeded error. please help me find why is my algorithm taking so long
所以我試圖解決加勒比在線評判網頁的問題1772 http://coj.uci.cu/24h/problem.xhtml?abb=1772 ,該問題要求查找更大字符串的子字符串是否包含在里面至少有一個回文:
例如,分析從以下字符串中取出的子字符串:“baraabarbabartaarabcde”
“bara”包含回文“ara”
“abar”包含一個回文“aba”
“babar”包含一個回文“babar”
“taar”包含一個回文“aa”
“abcde”不包含任何回文。
等等等......
我相信我的方法非常快,因為我在同一時間從第一個字符串和最后一個字符處開始迭代字符串,向字符串的中心前進,只查看以下模式:“aa”“aba”每當我找到一個像我可以說的那樣的模式,給定的子串包含一個回文。 現在的問題是該算法需要很長時間,但我無法發現問題。 請幫我找到它我真的迷失了這個。 這是我的算法
public static boolean hasPalindromeInside(String str)
{
int midpoint=(int) Math.ceil((float)str.length()/2.0);
int k = str.length()-1;
for(int i = 0; i < midpoint;i++)
{
char letterLeft = str.charAt(i);
char secondLetterLeft=str.charAt(i+1);
char letterRight = str.charAt(k);
char secondLetterRight = str.charAt(k-1);
if((i+2)<str.length())
{
char thirdLetterLeft=str.charAt(i+2);
char thirdLetterRight=str.charAt(k-2);
if(letterLeft == thirdLetterLeft || letterRight == thirdLetterRight)
{
return true;
}
}
if(letterLeft == secondLetterLeft || letterRight==secondLetterRight)
{
return true;
}
k--;
}
return false;
}
}
我刪除了抓取輸入字符串和子字符串間隔的代碼,我使用String.substring()來獲取子字符串,我不認為這會導致問題。 如果您需要該代碼,請告訴我。 謝謝!
我認為你可以在每個查詢的O(1)時間內解決這個問題,給定O(n)預處理以找到所有2和3個字符回文的位置。 (任何偶數plaindrome在中心將有一個2字符plaindrome,而任何奇數將有一個3字符一個所以它足以檢查2和3.)
例如,
鑒於你的字符串baraabarbabartaarabcde,首先計算一個數組,指出2個字符回文的位置:
baraabarbabartaarabcde
000100000000001000000-
然后計算此數組的累積總和:
baraabarbabartaarabcde
000100000000001000000-
000111111111112222222-
通過減法,您可以立即確定查詢范圍內是否有任何2個字符的回文。
同樣對於三個字符的平台:
baraabarbabartaarabcde String
01001000100000010000-- Indicator
01112222333333344444-- Cumulative
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.