算法(七)

本文探讨了两个经典算法问题的解决方案:寻找字符串中最长的无重复字符子串,以及将给定二叉树转换为其镜像。通过递归与非递归方法实现,深入理解数据结构与算法设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、给定一个字符串,请你找出其中不含有重复字符的最长子串的长度(无重复字符的最长子串)

代码如下:

public int lengthOfLongestSubstring(String s){

         int n = s.length();

         int ans = 0;

         for(int i=0; i<n; i++){

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

                           if(allUnique(s, i, j)){

                                 ans=Math.max(ans, j-i);

                           }

                  }

         }

         return ans;

}

public boolean allUnique(String s, int start, int end){

        Set<Character> set = new HashSet<>();

        for(int i=start; i<end; i++){

                 Character ch = s.charAt(i);

                 if(set.contains(ch)){

                          return false;

                 }

                 set.add(ch);

        }

        return true;

}

2、操作给定的二叉树,将其变换为源二叉树的镜像。

    解法1:

    /**
     * 递归实现
     * 关键就在于把大问题转化为子问题即可
     * @param root
     */
    public static void Mirror1(TreeNode root) {
        if(root != null) {
            TreeNode temp = root.left;
            root.left = root.right;
            root.right = temp;
            Mirror1(root.left);
            Mirror1(root.right);
        }
    }

    解法2:

    /**
     * 非递归实现, 借助栈或者列表遍历树中每一个非叶子节点
     * 交换其左右子树即可
     * @param root
     */
    public static void Mirror2(TreeNode root) {
        if(root == null) {
            return;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()) {
            TreeNode node = stack.pop();
            TreeNode temp = node.left;
            node.left = node.right;
            node.right = temp;
            if(node.left != null) {
                stack.push(node.left);
            }
            if(node.right != null) {
                stack.push(node.right);
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值