今天面试美团,一面挂,出了一道数组处理题目,完全想不到是用动态规划的方式解决。这里开始总结一下这类题目,即用动态规划的方式处理字符串类型题目。
leetcode题目
5 最长回文字串
- 解法一:暴力
时间复杂度O(n3)
空间复杂度O(1)
class Solution {
public String longestPalindrome(String s) {
if (s == null || "".equals(s))
return s;
int index1 = 0;
int maxCnt1 = 0;
int cnt1 = 0;
for (int i=0; i<s.length()-1; i++) {
if (s.charAt(i) == s.charAt(i+1)) {
cnt1 = 2;
int k = 1;
while (i-k >=0 && i+k+1 < s.length()) {
if (s.charAt(i-k) == s.charAt(i+k+1)) {
cnt1 += 2;
k++;
} else
break;
}
}
if (maxCnt1 < cnt1) {
index1 = i;
maxCnt1 = cnt1;
}
}
//第二次遍历,找aba这种情况
int index2 = 0;
int maxCnt2 = 0;
int cnt2 = 0;
for (int i=0; i<s.length(); i++) {
int k = 1;
cnt2 = 1;
while (i-k >=0 && i+k < s.length()) {
if (s.charAt(i-k) == s.charAt(i+k)) {
cnt2 += 2;
k++;
} else
break;
}
if (maxCnt2 < cnt2) {
index2 = i;
maxCnt2 = cnt2;
}
}
if (maxCnt1 > maxCnt2) {
maxCnt1 = maxCnt1-2;
return s.substring(index1-maxCnt1/2, index1+maxCnt1/2+2);
} else {
return s.substring(index2-maxCnt2/2, index2+maxCnt2/2+1);
}
}
}
- 解法二:dp(推荐这种)
如果我们已经知道 “bab” 是回文,那么很明显,“ababa” 一定是回文,因为它的左首字母和右尾字母是相同的。
给 P ( i , j ) P(i,j) P(i,j)的定义为:
P ( i , j ) = { t r u e , 如 果 字 串 s i . . . s j 是 回 文 f a l s e , 其 他 情 况 P(i,j)=\left\{ \begin{array}{c} true, 如果字串s_i...s_j是回文 \\ false, 其他情况\end{array}\right. P(i,j)={
true,如果字串s<