zoukankan      html  css  js  c++  java
  • leetcode14最长公共前缀多解法

    题目链接

    解法一:按列比较,选第一个字符为比较对象,若长度达到所有字符串中最短的字符长度,或者有不符合的出现,返回结果。时间击败了7.28%的人。

    class Solution {
            public String longestCommonPrefix(String[] strs) {
                String s = "";
                if (strs.length < 1)
                    return "";
                for (int i = 0; i < strs[0].length(); i++) {
                    char c = strs[0].charAt(i);
                    for (int j = 1; j < strs.length; j++) {
                        if (strs[j].length() <= i || strs[j].charAt(i) != c)
                            return s;
                    }
                    s += c;
                }
                return s;
            }
        }
    

    解法二:分治算法,将字符串数组分两半来算,然后再比较两个两半得到的结果,击败了99%。

     class Solution {
            public String longestCommonPrefix(String[] strs) {
                int len = strs.length;
                if (len < 1)
                    return "";
                return dfs(strs, 0, len - 1);
            }
    
            private String dfs(String[] strs, int begin, int end) {
                if (end <= begin) {
                    return strs[begin];
                }
                int mid = (begin + end) >> 1;
                String a = dfs(strs, begin, mid);
                String b = dfs(strs, mid + 1, end);
    
                int length = Math.min(a.length(), b.length());
                int index = 0;
                while (index < length && a.charAt(index) == b.charAt(index)) {
                    index++;
                }
                return a.substring(0, index);
            }
        }
    

    解法三:在评论区找到的一个巧妙解法,排序字符串数组,再比较第一个和最后一个即可,击败87%。

     class Solution {
            public String longestCommonPrefix(String[] strs) {
                if (strs.length < 1)
                    return "";
                Arrays.sort(strs);
                int index = 0;
                int min = Math.min(strs[0].length(), strs[strs.length - 1].length());
                for (int i = 0; i < min; i++) {
                    if (strs[0].charAt(i) != strs[strs.length - 1].charAt(i))
                        break;
                    index++;
                }
                return strs[0].substring(0, index);
            }
        }
    

    解法四:使用字典树(trim)算法,这个模板还是很有用的,需要根据题目需求在最基础的模板做一些修改,在细节处debug找了很久,最后击败了85%。

     class Solution {
            trie root;
    
            class trie {
                int flag;
                trie[] cnt;
    
                public trie() {
                    this.flag = 0;
                    cnt = new trie[26];
                    for (int i = 0; i < 26; i++)
                        cnt[i] = null;
                }
    
                public void insert(String s) {
                    trie tmp = root;
                    for (int i = 0; i < s.length(); i++) {
                        int num = s.charAt(i) - 'a';
                        if (tmp.cnt[num] == null) {
                            tmp.cnt[num] = new trie();
                        }
                        tmp = tmp.cnt[num];
                        tmp.flag++;
                    }
                }
    
                public int find(String s, int n) {
                    trie tmp = root;
                    for (int i = 0; i < s.length(); i++) {
                        int num = s.charAt(i) - 'a';
                        if (tmp.cnt[num].flag < n || tmp.cnt[num] == null)
                            return i;
                        tmp = tmp.cnt[num];
                    }
                    return s.length();
                }
            }
    
            public String longestCommonPrefix(String[] strs) {
                //trie树
                if (strs.length < 1 || strs == null)
                    return "";
                root = new trie();
                for (int i = 0; i < strs.length; i++) {
                    root.insert(strs[i]);
                }
                root.flag = strs.length;
                int len = root.find(strs[0], strs.length);
                return strs[0].substring(0, len);
            }
        }
    

    虽然是一道简单题目,前面两种算法很快就想出了,但是后面复习了分治算法和字典树算法,其中分治很快自己写出来了,字典树是忘记了又去看了一遍自己写的,一下午就过了,还算有点收获。

  • 相关阅读:
    15. DML, DDL, LOGON 触发器
    5. 跟踪标记 (Trace Flag) 834, 845 对内存页行为的影响
    4. 跟踪标记 (Trace Flag) 610 对索引组织表(IOT)最小化日志
    14. 类似正则表达式的字符处理问题
    01. SELECT显示和PRINT打印超长的字符
    3. 跟踪标记 (Trace Flag) 1204, 1222 抓取死锁信息
    2. 跟踪标记 (Trace Flag) 3604, 3605 输出DBCC命令结果
    1. 跟踪标记 (Trace Flag) 1117, 1118 文件增长及空间分配方式
    0. 跟踪标记 (Trace Flag) 简介
    SpringBoot + Redis + Shiro 实现权限管理(转)
  • 原文地址:https://www.cnblogs.com/alike/p/13536333.html
Copyright © 2011-2022 走看看