zoukankan      html  css  js  c++  java
  • leetcode-14-最长公共前缀

    问题:

    解:

    请注意,该问题是查找最长公共前缀

    一、水平扫描法

    package com.example.demo;
    
    public class Test14 {
    
        /**
         * 查找字符串数组中最长的公共**前缀**
         *
         * @param strs
         * @return
         */
        public String longestCommonPrefix(String[] strs) {
            //水平扫描法
            if (strs == null || strs.length == 0) {
                return "";
            }
            String prefix = strs[0];
            for (int i = 1; i < strs.length; i++) {
                // 因为查找的各个字符串的前缀,所以A字符串在B字符串中的开头,不是开头的话,prefix--,重新查询,制动为空时结束
                while (strs[i].indexOf(prefix) != 0) {
                    prefix = prefix.substring(0, prefix.length() - 1);
                    if (prefix.isEmpty()) {
                        return "";
                    }
                }
            }
            return prefix;
        }
    
        public static void main(String[] args) {
            Test14 t = new Test14();
            String[] strings = {"abcd", "abc", "ab"};
            String s = t.longestCommonPrefix(strings);
            System.out.println(s);
    
        }
    }

    二、分支法

    package com.example.demo;
    
    public class Test14 {
    
        /**
         * 查找字符串数组中最长的公共**前缀**
         *
         * @return
         */
        public String longestCommonPrefix1(String[] strs) {
            //分治法
            if (strs == null || strs.length == 0) {
                return "";
            }
            return longestCommonPrefix1(strs, 0, strs.length - 1);
        }
    
        /**
         * 递归、分治
         *
         * @param strs
         * @param left
         * @param right
         * @return
         */
        private String longestCommonPrefix1(String[] strs, int left, int right) {
            // 递归终止条件
            if (left == right) {// 递归的终止条件要选择好
                return strs[left];
            } else {
                int mid = (left + right) / 2;
                // 递归的思想(不要深入想递归内部,只要在宏观上认为,该递归返回的字符串就是left到mid之间的最长公共前缀)
                String lcpLeft = longestCommonPrefix1(strs, left, mid);
                String lcpRight = longestCommonPrefix1(strs, mid + 1, right);
                //将返回的左右两个最长公共子串进行比较,获取最终的最长公共前缀
                return comparePreFix(lcpLeft, lcpRight);
            }
        }
    
        /**
         * 比较两个字符串中的最长前缀
         *
         * @param lcpLeft
         * @param lcpRight
         * @return
         */
        private String comparePreFix(String lcpLeft, String lcpRight) {
            int len = Math.min(lcpLeft.length(), lcpRight.length());
            for (int i = 0; i < len; i++) {
                if (lcpLeft.charAt(i) != lcpRight.charAt(i)) {
                    return lcpLeft.substring(0, i);
                }
            }
            return lcpLeft.substring(0, len);
        }
    
    
        public static void main(String[] args) {
            Test14 t = new Test14();
            String[] strings = {"abcd", "abc", "ab"};
            String s = t.longestCommonPrefix1(strings);
            System.out.println(s);
    
        }
    }
        
  • 相关阅读:
    Confluence 6 配置服务器基础地址示例
    (七)git分支的操作
    (六)最最基本的git操作
    (四)创建表、查看表、插入记录
    (三)数据库基本操作(创建、查询、修改、删除数据库)
    c++第九天
    (五)使用GitHub的前期准备
    (四)github之Git的初始设置
    (三)github之GIT的导入
    (二)github的价值意义篇
  • 原文地址:https://www.cnblogs.com/nxzblogs/p/11226629.html
Copyright © 2011-2022 走看看