返回
程序员解题之路:汽水瓶与查找最长公共子串
后端
2023-12-16 05:11:04
在算法的世界里,刷题是一种常见的学习方式,有助于提高编程能力和解决问题的能力。作为一名初学者,我在牛客试题广场上进行刷题练习时,遇到了两道题:汽水瓶和查找两个字符串a,b中的最长公共子串。在这里,我将分享我的解题思路和过程,希望能对其他正在学习算法的朋友有所帮助。
汽水瓶
问题
小明有一个汽水瓶,每次喝完汽水后,他都会把汽水瓶叠起来,直到汽水瓶叠到一定高度时,就会倒塌。现在,小明想知道在汽水瓶倒塌之前,他最多可以叠放多少个汽水瓶。
解题思路
这道题可以采用贪心算法来求解。贪心算法的基本思想是在每一步中做出当前最优的选择,以期最终得到全局最优解。对于这道题,我们可以先计算出汽水瓶叠放的高度,然后不断叠放汽水瓶,直到高度超过限制值为止。
代码实现
import java.util.Scanner;
public class Bottle {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); // 汽水瓶的数量
int h = scanner.nextInt(); // 汽水瓶叠放的高度限制
int height = 0; // 当前汽水瓶叠放的高度
int count = 0; // 汽水瓶的叠放次数
for (int i = 0; i < n; i++) {
height += 1; // 叠放一个汽水瓶
count++; // 叠放次数加1
if (height > h) {
break; // 如果高度超过限制值,则停止叠放
}
}
System.out.println(count); // 输出叠放次数
}
}
查找两个字符串a,b中的最长公共子串
问题
给定两个字符串a和b,求出a和b的最长公共子串。最长公共子串是指两个字符串中最长的相同子串。
解题思路
这道题可以使用动态规划算法来求解。动态规划的基本思想是将问题分解成一系列子问题,然后通过求解这些子问题来得到最终的解。对于这道题,我们可以先求出a和b的子字符串的相似性,然后根据相似性来构造最长公共子串。
代码实现
import java.util.Arrays;
public class LongestCommonSubstring {
public static void main(String[] args) {
String a = "ABCD";
String b = "ACED";
int[][] dp = new int[a.length() + 1][b.length() + 1];
// 计算相似性
for (int i = 1; i <= a.length(); i++) {
for (int j = 1; j <= b.length(); j++) {
if (a.charAt(i - 1) == b.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1] + 1;
}
}
}
// 构造最长公共子串
int maxLen = 0;
int startIndex = 0;
for (int i = 1; i <= a.length(); i++) {
for (int j = 1; j <= b.length(); j++) {
if (dp[i][j] > maxLen) {
maxLen = dp[i][j];
startIndex = i - maxLen;
}
}
}
System.out.println(a.substring(startIndex, startIndex + maxLen)); // 输出最长公共子串
}
}
希望这篇博客对您有所帮助,如果你在学习算法时遇到困难,不要气馁,坚持下去,相信你终将取得成功!