0
点赞
收藏
分享

微信扫一扫

【百日冲大厂】第十九篇,牛客网选择题+编程题汽水瓶+ 查找两个字符串a,b中的最长公共子串(动态规划问题)

求阙者 2023-07-02 阅读 32

在这里插入图片描述

目录

1. 选择题

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2. 编程题

2.1 汽水瓶

在这里插入图片描述
在这里插入图片描述

import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            if(n == 0){
                return;
            }
            int num = nums(n);
            System.out.println(num);

        }
    }
    private static int nums(int n){
        if(n <2){
            return 0;
        }
        int sum = 0;
        int empty = n;
        while(empty>=3){
            sum+= empty/3;
            empty = empty%3+empty/3;
            }
        if(empty == 2){
            sum+=1;
        }
        return sum;
    }
    }

2.2 查找两个字符串a,b中的最长公共子串

在这里插入图片描述

在这里插入图片描述

import java.util.*;
public class Main {
    public static String getMaxSubstr(String str1, String str2){
        char[] arr1 = str1.toCharArray();
        char[] arr2 = str2.toCharArray();
        int len1 = arr1.length;
        int len2 = arr2.length;
		//最长子串的起始位置
        int start = 0;
		//最长子串的长度
        int maxLen = 0;
		//多增加一行一列,作为辅助状态
		//状态: 以a的第i个字符结尾和以b的第j个字符结尾的最长公共子串的长度
        int[][] maxSubLen = new int[len1 + 1][len2 + 1];
        for(int i = 1; i <= len1; ++i)
        {
            for(int j = 1; j <= len2; ++j)
            {
				//如果第i个字符和第j个字符相等,则进行累加
                if(arr1[i - 1] == arr2[j - 1])
                {
                    maxSubLen[i][j] = maxSubLen[i - 1][j - 1] + 1;
				//更新最长公共子串
                    if(maxLen < maxSubLen[i][j])
                    {
                        maxLen = maxSubLen[i][j];
                        start = i - maxLen;
                    }
                }
            }
        }
        return str1.substring(start, start + maxLen);
    }
    public static void main(String[] args) 
    {
        Scanner sc = new Scanner(System.in);
        String str1;
        String str2;
        while(sc.hasNext()) {
            str1 = sc.next();
            str2 = sc.next();
            //为什么要以短的为主体呢?我们要看清题哈.
            if (str1.length() < str2.length())
                System.out.println(getMaxSubstr(str1, str2));
            else
                System.out.println(getMaxSubstr(str2, str1));
        }
    }
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

举报

相关推荐

0 条评论