文章目录

  • 题目1——最长公共子串
    • 解题思路
    • 代码实现
  • 题目2——最长回文子串
    • 解题思路
    • 代码实现
  • 题目3——兑换零钱
    • 解题思路
    • 代码实现

题目1——最长公共子串

给定两个字符串str1和str2,输出两个字符串的最长公共字串。题目保证str1和str2的最长公共字串存在且唯一。
要求: 空间复杂度 O(n^2),时间复杂度 O(n^2)。

示例
输入:“1AB2345CD”,“12345EF”
输出:“2345”

解题思路

利用动态规划,定义dp[i][j] 为str1的前 i 个字符和str2的前 j 个字符的最长公共子串长度,因为子串必须连续,所以状态方程应为dp[i][j] = dp[i-1][j-1]+1,为了确定字串的范围,需要定义一个maxlen来记录最长公共字串的最大长度,同时需要定义一个index来记录公共子串的下标;如果找不到子串,返回”-1“。

代码实现

import java.util.*;
public class Solution {public String LCS (String str1, String str2) {if(str1 == null || str2 == null)return "-1";int m = str1.length();int n = str2.length();int maxlen = 0; //记录最长公共子串的长度int index = 0;int[][] dp = new int[m][n];  //记录以i下标结束的字符串和j下标结束的字符串的公共子串的长度     //初始化二维矩阵边界if(str1.charAt(0) == str2.charAt(0)){dp[0][0] = 1;maxlen = 1;}for(int i=1;i<n;i++){if(str1.charAt(0) == str2.charAt(i)){dp[0][i] = 1;maxlen = 1;}}for(int i=1;i<m;i++){if(str1.charAt(i) == str2.charAt(0)){dp[i][0] = 1;maxlen = 1;}}for(int i=1;i<m;i++){for(int j=1;j<n;j++){//当两个字符相同时,更新dpif(str1.charAt(i) == str2.charAt(j)){dp[i][j] = dp[i-1][j-1]+1;//若当前长度大于maxlen,则更新maxlen和当前公共字串的下标if(maxlen <= dp[i][j]){maxlen = dp[i][j];index = i;}}}}if(maxlen == 0)return "-1";return str1.substring(index-maxlen+1,index+1);}
}

题目2——最长回文子串

对于一个长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。
要求:空间复杂度O(n),时间复杂度O(n^2)

示例
输入:“ababc”
输出:3 (最长的回文子串为"aba")

解题思路

定义一个布尔类型的数组dp,dp[i][j]表示下标i到下标j的子串是否为回文字符串,如果是,则dp[i+1][j-1]也是回文字符串,由此可得,状态转移方程dp[i][j] = true if (dp[i+1][j-1] && str[i] == str[j]

代码实现

import java.util.*;
public class Solution {public int getLongestPalindrome (String A) {int n = A.length();String ans = "";boolean[][] dp = new boolean[n][n];for(int k=0;k<n;++k){ //k是i与j之间的间隔for(int i=0;i+k<n;++i){int j = i+k;//k=0,k=1都为边界情况if(k==0){dp[i][j]=true;}else if(k==1){dp[i][j] = (A.charAt(i) == A.charAt(j));}else{dp[i][j] = (A.charAt(i) == A.charAt(j) && dp[i+1][j-1]);}//如果[i:j]回文字符串,且大与现有回文字符串长度,进行更新if(dp[i][j] && k+1>ans.length())ans = A.substring(i,j+1);}  }return ans.length();}
}

题目3——兑换零钱

给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。如果无解,请返回-1。
要求:时间复杂度O(n*aim),空间复杂度O(aim)。

示例
输入:[5,2,3], 20
输出:4

解题思路

重新回顾动态规划算法的基本思想:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并将答案保存起来。

在这个问题中,可以用dp[i]表示要凑出 i 元钱需要的最小货币数,因为货币最小为1元,所以开始可以将每个元素设置为最大值aim+1,使得货币数不会超过aim。凑出 i 元的最小货币数应该为dp[i] = min(dp[i],dp[i-arr[j]]+1).

代码实现

import java.util.*;
public class Solution {public int minMoney (int[] arr, int aim) {if(aim<1)return 0;int[] dp = new int[aim+1];//填充数组最大值aim+1Arrays.fill(dp,aim+1);dp[0] = 0;for(int i=1;i<=aim;i++){//计算每种面值,取最小的货币数for(int j=0;j<arr.length;j++){if(arr[j]<=i){dp[i] = Math.min(dp[i],dp[i-arr[j]]+1);}}}//如果最终答案大于aim,则表示无解return dp[aim]>aim?-1:dp[aim];}
}

牛客题目——最长公共子串、最长回文子串、兑换零钱相关推荐

  1. python回文子串_LeetCode 647. 回文子串 | Python

    647. 回文子串 题目 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串. 示例 1: 输入:" ...

  2. 华为牛客网在线笔试题之是否是回文串

    最近投了个华为的简历,然后收到了牛客网的在线笔试,题目有三道,第一道是给定一串字符,找出其中最长的回文串,并返回其长度. 我用C++实现的,思路是遍历字符串的每一个字符,然后设置初始值为1的偏移量,如 ...

  3. 怎么判断一个字符串的最长回文子串是否在头尾_回文自动机入门

    缘起 回文自动机(Palindrome auto machine PAM,有些地方称之为回文树)是回文问题的大杀器~  本文使用一道很简单的题目入门这个精巧的数据结构. hdu 2163 Palind ...

  4. LeetCode5-最长回文子串原理及Python实现

    LeetCode5(medium)-最长回文子串 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 思路 中心扩展法 遍历字符串,依次把每个字符作为中心. ...

  5. 怎么判断一个字符串的最长回文子串是否在头尾_【Leetcode每日打卡】最长回文串...

    干货预警:所有文章都会首发于我的公众号[甜姨的奇妙冒险],欢迎watch. 一.来历: 力扣从3月开始开启了每日一题打卡活动,于是跟风加入了打卡大军,这两天写评论.发题解,没想到反响还不错,收到了来自 ...

  6. 动态规划之最长回文子串

    题目要求 对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度. 解题思路 维持一个dp二维数组,dp[i][j]表示下标为i到下标为j的子串是否为 ...

  7. 最长回文子串(C/C++动态规划)

    题目描述 输入一个字符串Str,输出Str里最长回文子串的长度. 回文串:指aba.abba.cccbccc.aaaa这种左右对称的字符串. 串的子串:一个串的子串指此(字符)串中连续的一部分字符构成 ...

  8. 【代码训练营】day56 | 647. 回文子串 516.最长回文子序列

    所用代码 java 回文子串 LeetCode 647 题目链接:回文子串 LeetCode 647 - 中等 思路 dp[i] [j]:[i, j]子串是否是回文子串,是回文就是true 递推公式: ...

  9. 【LeetCode】5.最长回文子串

    5.最长回文子串 一.问题描述 给你一个字符串 s,找到 s 中最长的回文子串. 二.问题简化 所谓回文字符串,即反过来念的字符串和正着念一样.比如"卿卿我我卿卿"."一 ...

  10. 每天一道LeetCode-----最长回文子串/序列,从头开始的最长回文子串长度

    Longest Palindromic Substring 原题链接 Longest Palindromic Substring 意思是找到最长的回文子串,注意子串和子序列的区别 蛮力法就将每个可能的 ...

最新文章

  1. 集成学习-Adaboost
  2. 三星Exynos芯片只卖魅族?或是高通所致
  3. CICC科普栏目|神经网络浅讲:从神经元到深度学习
  4. 【转】SSL/TLS/WTLS协议原理
  5. 使用PyQT编写界面程序
  6. SAP Data Intelligence API执行出错的排错之道
  7. 高并发大流量专题---10、MySQL数据库层的优化
  8. NoSQL数据库:从故障中恢复数据的原理
  9. 符号级别(二)--实际应用
  10. 【微信小程序】解决Echarts在微信小程序tab切换时的显示问题
  11. 大于2019电大计算机应用上机表格题,2019年电大计算机应用基础试题及答案重要知识点...
  12. postman tests实例记录,常用测试结果验证及使用技巧
  13. “为了买台手机,研究大半个月后仍然无从选择”
  14. JDBC之CallableStatement执行存储过程
  15. 区块链现在的样子:当年的DOS操作系统
  16. FBX导入Unity中模型没有材质的处理
  17. HTTP/HTTPS
  18. 一年前转行RPA,如今聊聊RPA
  19. java是引用传递还是值传递_流言终结者:Java是引用传递还是值传递?
  20. svn禁止访问“/svn/project/!svn/act解决办法

热门文章

  1. 打造基于人工智能的移动网络
  2. 用心感受生活,才会发现生活的乐趣。
  3. jarvisoj pwn XMAN系列
  4. Auto.js学习笔记10:实例化自定义对象,在子线程使用JSON.stringify()方法导致报错(已解决)
  5. 光线凭借《左耳》胜出五一档后,又要拉上奇虎360整大事?
  6. Latex三线表格编辑
  7. 2020自考计算机应用技术,2020年8月自考02316计算机应用技术真题及答案
  8. Java全栈知识体系
  9. 首届中国房地产数字峰会圆满落幕,关于地产第二增长曲线,他们的答案在这里...
  10. ZETA SDR网关推动LPWAN2.0泛在物联,覆盖距离可达30km