ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

牛客华为机试HJ85

2022-04-22 07:34:58  阅读:173  来源: 互联网

标签:String int res 牛客 length && 机试 HJ85 dp


原题传送门

1. 问题描述

2. Solution 1: Brute Force

1、思路
两层循环遍历所有子串,判断是否为回文,保留最长的子串。
2、代码实现

import sys

if sys.platform != "linux":
    file_in = open("input/HJ85.txt")
    sys.stdin = file_in


def check(s, i, j):
    start = i
    end = j
    while start <= end:
        if s[start] != s[end]:
            return False
        start += 1
        end -= 1
    return True


def solve(s):
    max_len = 1
    for i in range(len(s)):
        for j in range(i + 1, len(s)):
            if check(s, i, j) and (j - i + 1) > max_len:
                max_len = j - i + 1
    print(max_len)


for line in sys.stdin:
    s = line.strip()
    solve(s)

3. Solution 2

1、思路: 用DP优化暴力法
Dynamic Programming

  1. 状态定义
    boolean dp[i][j] = s[i, j] is Palindromic
  2. 状态初始条件
    dp[i][j] = true if len(s[i, j]) == 1 or j == i or j - i == 0;
    dp[i][j] = s[i] == s[j] if len(s[i, j]) == 2 or j == (i + 1) or j - i == 1;
  3. 状态转移方程
    dp[i][j] = s[i] == s[j] && dp[i+1][j-1]

判断条件整合:
a. 若: j - i == 0 , 则dp[i][j] = (s[i] == s[j]) 恒为true, 1个字符自然回文
b. 若: j - i == 1 , 则dp[i][j] = s[i] == s[j] 2个字符,首尾相等即可
c. 若: j - i == 2 , 则dp[i][j] = s[i] == s[j] 3个字符,首尾相等即可,中间有1个字符,不打紧
d. 若: j - i > 2 , 则dp[i][j] = s[i] == s[j] && dp[i + 1][j - 1] 4个字符(含),首尾相等,外加中间子串为回文才行
a. b. c. 判断条件整合 => s[i] == s[j] && (j - i <= 2)
与d. 合并后 判断条件整合为一个 => s[i] == s[j] && ( (j - i <= 2) || dp[i + 1][j - 1] )
2、示例
input: s = "babad";
用j遍历行,i遍历列,只使用了下三角
image.png
3、代码实现

public class Solution3 {
    public String longestPalindrome(String s) {
        if (s == null || s.length() == 0) return s;
        String res = "";
        boolean[][] dp = new boolean[s.length()][s.length()];
        int max = 0;
        for (int j = 0; j < s.length(); j++) {
            for (int i = 0; i <= j; i++) {
                dp[i][j] = s.charAt(i) == s.charAt(j) &&
                        ((j - i <= 2) || dp[i + 1][j - 1]);
                if (dp[i][j] && (j - i + 1 > max)) {
                    max = j - i + 1;
                    res = s.substring(i, j + 1);  // [i, j+1)
                }
            } // end of inner for loop
        } // end of outer for loop
        return res;
    }
}

time: O(n^2)
space: O(n^2)
4、优化使用一维数组

/*
    对Solution3的优化,使用一维数组
 */
public class Solution4 {

    public String longestPalindrome(String s) {
        if (s == null || s.length() == 0) return s;
        String res = "";
        boolean[] dp = new boolean[s.length()];
        int n = s.length();
        for (int i = n - 1; i >= 0; i--) {
            for (int j = n - 1; j >= i; j--) {
                dp[j] = s.charAt(i) == s.charAt(j) &&
                        ((j - i) < 3 || dp[j - 1]);
                if (dp[j] && j - i + 1 > res.length())
                    res = s.substring(i, j + 1); // [i, j+1)
            }
        }
        return res;
    }
}

time: O(n^2)
space: O(n)

标签:String,int,res,牛客,length,&&,机试,HJ85,dp
来源: https://www.cnblogs.com/junstat/p/16177300.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有