欢迎访问宙启技术站
智能推送

Java函数实现常见算法题:斐波那契数列、字符串最长公共子串等

发布时间:2023-05-22 04:31:25

Java作为一种广泛使用的编程语言,其功能丰富,能够实现各种各样的算法题目。本文将介绍常见的算法题:斐波那契数列、字符串最长公共子串等,并给出Java函数实现。

1、斐波那契数列

斐波那契数列是指:1、1、2、3、5、8、13、21、34、……,即数列中某一项的值等于其前两项之和。要求实现一个函数,输入n,返回斐波那契数列第n项的值。

Java函数实现:

public static int fibonacci(int n) {

    if(n == 0) {

        return 0;

    } else if(n == 1) {

        return 1;

    } else {

        return fibonacci(n-1) + fibonacci(n-2);

    }

}

2、字符串最长公共子串

给定两个字符串S1和S2,求这两个字符串的最长公共子串。例如,对于字符串“abcde”和“acde”,它们的最长公共子串是“cde”。要求实现一个函数,输入两个字符串,返回它们的最长公共子串。

Java函数实现:

public static String longestCommonSubstring(String s1, String s2) {

    int m = s1.length();

    int n = s2.length();

    int maxLen = 0;// 最长的子串长度

    int endIndex = 0; // 最长子串在s1中的末尾位置

    int[][] dp = new int[m+1][n+1]; // 初始化二维数组

    for (int i = 1; i <= m; ++i) {

        for (int j = 1; j <= n; ++j) {

            if (s1.charAt(i-1) == s2.charAt(j-1)) { // 如果二者字符相等

                dp[i][j] = dp[i-1][j-1] + 1; // 则当前公共子串长度等于之前一个的长度加上1

                if (dp[i][j] > maxLen) { // 更新最长子串数据

                    maxLen = dp[i][j];

                    endIndex = i;

                }

            } else {

                dp[i][j] = 0; // 如果二者字符不等,则当前长度为0

            }

        }

    }

    return s1.substring(endIndex-maxLen, endIndex); // 返回最长子串

}

3、二叉树的最近公共祖先

给定一棵二叉树以及两个节点p和q,求它们的最近公共祖先节点。要求实现一个函数,输入两个节点p和q,返回它们的最近公共祖先节点。

Java函数实现:

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {

    if (root == null || root == p || root == q) {

        return root;

    }

    TreeNode left = lowestCommonAncestor(root.left, p, q); // 遍历左子树,查找p和q的最近公共祖先

    TreeNode right = lowestCommonAncestor(root.right, p, q); // 遍历右子树,查找p和q的最近公共祖先

    if (left != null && right != null) { // 如果左子树和右子树均可以找到,说明当前节点就是最近公共祖先

        return root;

    } else if (left != null) { // 如果只在左子树找到p或q,则继续向上查找

        return left;

    } else { // 如果只在右子树找到p或q,则继续向上查找

        return right;

    }

}

以上就是本文介绍的三个算法题:斐波那契数列、字符串最长公共子串、二叉树的最近公共祖先,并给出了Java函数实现。这些算法题可以帮助我们提高编程能力,并拓宽我们的专业知识。