字符串处理中的动态规划

本文主要探讨使用动态规划解决字符串类型的题目,通过分析LeetCode的5最长回文字串、快手笔试题以及美团面试题,展示了如何运用动态规划来处理数组和序列问题,包括寻找最长回文子串、数组划分和序列的最长等差序列等。
摘要由CSDN通过智能技术生成

今天面试美团,一面挂,出了一道数组处理题目,完全想不到是用动态规划的方式解决。这里开始总结一下这类题目,即用动态规划的方式处理字符串类型题目。

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<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值