返回

算法刷题日记:斐波拉契数的最小步数与合法括号序列的判断

后端

斐波拉契数最小步数

斐波拉契数列是由0和1开始,之后的每个数都为前两个数之和。斐波拉契数列前几项为:0、1、1、2、3、5、8、13、21、34、……

给定一个正整数n,您需要找到将n分解为斐波拉契数之和的最小步数。

例如,如果n=10,则有以下几种分解方式:

  • 10 = 8 + 2
  • 10 = 5 + 5
  • 10 = 3 + 3 + 4

其中,最少分解步数为2(8+2),因此答案为2。

合法括号序列判断

给定一个只包含'('和')'的字符串,您需要判断该字符串是否是合法的括号序列。

合法的括号序列是指,每个左括号'('都必须有对应的右括号')'与之匹配,并且括号不能交叉或重叠。

例如,以下字符串是合法的括号序列:

  • "()"
  • "()()"
  • "((()))"

以下字符串不是合法的括号序列:

  • "(())"
  • "(()"
  • "))"

Java代码实现

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 获取输入
        int n = scanner.nextInt();
        String str = scanner.next();

        // 判断斐波拉契数最小步数
        int minSteps = fibonacciMinSteps(n);
        System.out.println(minSteps);

        // 判断合法括号序列
        boolean isValid = isValidParentheses(str);
        System.out.println(isValid);
    }

    /**
     * 计算斐波拉契数最小步数
     *
     * @param n 正整数
     * @return 最小步数
     */
    public static int fibonacciMinSteps(int n) {
        if (n == 0 || n == 1) {
            return 0;
        }

        // 初始化斐波拉契数列
        int[] fib = new int[n + 1];
        fib[0] = 0;
        fib[1] = 1;

        // 计算斐波拉契数列
        for (int i = 2; i <= n; i++) {
            fib[i] = fib[i - 1] + fib[i - 2];
        }

        // 计算最小步数
        int minSteps = Integer.MAX_VALUE;
        for (int i = 1; i <= n; i++) {
            if (fib[i] <= n) {
                int steps = fibonacciMinSteps(n - fib[i]) + 1;
                if (steps < minSteps) {
                    minSteps = steps;
                }
            }
        }

        return minSteps;
    }

    /**
     * 判断合法括号序列
     *
     * @param str 字符串
     * @return 是否合法
     */
    public static boolean isValidParentheses(String str) {
        if (str == null || str.length() == 0) {
            return true;
        }

        // 使用栈来存储左括号
        Stack<Character> stack = new Stack<>();

        // 遍历字符串
        for (char c : str.toCharArray()) {
            if (c == '(') {
                stack.push(c);
            } else if (c == ')') {
                if (stack.isEmpty()) {
                    return false;
                }

                stack.pop();
            }
        }

        // 如果栈不为空,则字符串不是合法的括号序列
        return stack.isEmpty();
    }
}

希望这篇文章对您有所帮助!