服了,一道dp寫一天,寫出來的**還巨爛
dp思路:
正序串和逆序串找最長公共子串,注意需另外判斷子串是否為回文串,比如"abchkcba",這個很坑。
dp陣列記錄正序串在i之前,逆序串在j之前的最長公共子串長度,公共子串以 [i][j] 處的char作為結束的,所以當 chararr[i] != adverse[j] 時,最長公共子串長度直接為0。
dp時,if(chararr[i] == adverse[j]) dp[i][j] = dp[i-1][j-1] + 1;else不做處理。else這裡一開始做錯了,瞎搞,原因是不理解第2點寫的dp思路。
guide陣列記錄正序串在i之前的最長公共子串長度,只有dp[i][j]比原guide[i]大時才需替換,最後記錄的是正序串在i之前和逆序串的全部的最長公共子串長度(公共子串是帶 i 的,所以取公共子串時直接從 i 向前取就行了)。
字串逆轉時可以用 string reverse = new stringbuffer(s).reverse().tostring();
//由例項4可知,應假定chararr為列,adverse為行
//初始化第一行
for (int i = 0; i < adverse.length; i++)
else
dp[0][i] = 0;
}//初始化第一列
for (int i = 0; i < adverse.length; i++)
for (int i = 1; i < s.length(); i++)
// else
// dp[i][j] = math.max(dp[i-1][j], dp[i][j-1]);}}
system.out.println();system.out.println();
// for (int i = 0; i < s.length(); i++)
// }
system.out.println();
int max = 0;
for (int i = 0; i < guide.length; i++)
system.out.println();
system.out.println(max);
return s.substring(max+1-guide[max], max+1);
}public boolean ishuiwen(string s)
}
最長回文子串 力扣5
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 利用回文字串的特點 正著讀和反著讀都是一樣的,所以首先把s反轉,利用i和j控制左右邊界,不斷從s中擷取...
力扣 5 最長回文子串
題目 和647類似 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 題解 方法一 面試題,要求最長只能一趟迴圈 中心擴散法 class solutio...
力扣題庫 5 最長回文子串
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 從中心向兩端尋找,最終得到最大的字串 找單數最大,如為回文,則長度為 2 itmp 1 itmp so...