Longest Common Prefix 五种解法(JAVA)

解法一:水平扫描

int indexOf(String str): 在字符串中检索str,返回其第一出现的位置,如果找不到则返回-1

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0)
            return "";
        String prefix = strs[0];
        for(int i = 1; i < strs.length; i++){
            while(strs[i].indexOf(prefix) != 0){
                prefix = prefix.substring(0, prefix.length()-1);
                if(prefix.isEmpty())
                    return "";
            }
        }
        return prefix;
    }
}

解法二:垂直扫描

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0)
            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 strs[0].substring(0, i);
            }
        }
        return strs[0];
    }
}

解法三:分治法

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0)
            return "";
        return subprefix(strs, 0, strs.length-1);
    }
    public String subprefix(String[] strs, int left, int right){
        if(left >= right)
            return strs[left];
        int mid = (left + right) / 2;
        String lsub = subprefix(strs, left, mid);
        String rsub = subprefix(strs, mid+1, right);//!!!分治法
        int min = Math.min(lsub.length(), rsub.length());
        for(int i = 0; i < min; i++){
            if(lsub.charAt(i) != rsub.charAt(i))
                return lsub.substring(0, i);
        }
        return lsub.substring(0, min);
    }
}

解法四:二分搜索法

public boolean startsWith(String prefix, int toffset)  prefix -- 前缀。 toffset -- 字符串中开始查找的位置
class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0)
            return "";
        int minlen = Integer.MAX_VALUE;
        for(String str : strs)
            minlen = Math.min(minlen, str.length());
        int low = 1; //这里指第一个字符串
        int high = minlen;
        while(low <= high){
            int mid = (low+high)/2;
            if(isCommonPrefix(strs, mid)){
                low = mid+1;//+1
            }
            else{
                high = mid-1;//-1
            }
        }
        return strs[0].substring(0, (low+high)/2);
    }
    public boolean isCommonPrefix(String[] strs, int len){
        String str1 = strs[0].substring(0, len);
        for(int i = 1; i < strs.length; i++)
            if(!strs[i].startsWith(str1))
                return false;
        return true;
    }
}

解法五:Tire树

public String longestCommonPrefix(String q, String[] strs) {
    if (strs == null || strs.length == 0)
         return "";
    if (strs.length == 1)
         return strs[0];
    Trie trie = new Trie();
    for (int i = 1; i < strs.length ; i++) {
        trie.insert(strs[i]);
    }
    return trie.searchLongestPrefix(q);
}

class TrieNode {

    // R links to node children
    private TrieNode[] links;

    private final int R = 26;

    private boolean isEnd;

    // number of children non null links
    private int size;
    public void put(char ch, TrieNode node) {
        links[ch -‘a‘] = node;
        size++;
    }

    public int getLinks() {
        return size;
    }
    //assume methods containsKey, isEnd, get, put are implemented as it is described
   //in  https://leetcode.com/articles/implement-trie-prefix-tree/)
}

public class Trie {

    private TrieNode root;

    public Trie() {
        root = new TrieNode();
    }

//assume methods insert, search, searchPrefix are implemented as it is described
//in  https://leetcode.com/articles/implement-trie-prefix-tree/)
    private String searchLongestPrefix(String word) {
        TrieNode node = root;
        StringBuilder prefix = new StringBuilder();
        for (int i = 0; i < word.length(); i++) {
            char curLetter = word.charAt(i);
            if (node.containsKey(curLetter) && (node.getLinks() == 1) && (!node.isEnd())) {
                prefix.append(curLetter);
                node = node.get(curLetter);
            }
            else
                return prefix.toString();

         }
         return prefix.toString();
    }
}

原文地址:https://www.cnblogs.com/yawenw/p/12663968.html

时间: 2024-10-08 21:14:05

Longest Common Prefix 五种解法(JAVA)的相关文章

[LeetCode][14]Longest Common Prefix解析 两种算法和底层源码的深入对比-Java实现

Q: Write a function to find the longest common prefix string amongst an array of strings. A: 这题的大概意思就是说给你一组字符串找出其中最长的哪个通用的前缀出来.这个东西不难找,但是如何找的又快又好不简单.其实这题本来就是easy题,但是却让我联想到了<数据结构与算法分析>上的一道题目,那道题目是这样的: 给一个8900个字的字典,从中间找出类似abc.bbc.abb这样单词中只有一个字母不同的单词进行

LeetCode 14 Longest Common Prefix (C,C++,Java,Python)

Problem: Write a function to find the longest common prefix string amongst an array of strings. Solution: 时间复杂度O(n) 题目大意: 给一个字符串数组,要找到这些字符串的最大前缀公共子串. 解题思路: 既然是公共子串,那每个字符串肯定都包含有,并且在头部,首先把第一个字符串作为默认最大,然后依次与后边每一个字符串对比,计算所有的最大匹配长度,长度最小的就是 Java源代码(用时263ms

Longest Common Prefix leetcode java

题目: Write a function to find the longest common prefix string amongst an array of strings. 题解: 解题思路是,先对整个String数组预处理一下,求一个最小长度(最长前缀肯定不能大于最小长度). 然后以第0个字符串作为参照,从第1个字符串到最后一个字符串,对同一位置做判断,有不同字符串返回当前记录的字符串就行. 我的代码如下,不是那么简洁好看,下面有个整理的更好一些: 1     private stat

LeetCode第[14]题(Java): Longest Common Prefix

题目:最长公共前缀 难度:EASY 题目内容: Write a function to find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string "". 翻译:编写一个函数,在字符串数组中查找最长公共前缀字符串. 如果没有公共前缀,则返回空字符串. Example 1: Input: ["flow

LeetCode算法题-Find the Difference(Java实现-五种解法)

这是悦乐书的第214次更新,第227篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第82题(顺位题号是389).给定两个字符串s和t,它们只包含小写字母.字符串t由随机混洗字符串s生成,然后在随机位置再添加一个字母.找到t中添加的字母.例如: 输入:s ="abcd", t ="abcde" 输出:'e' 说明:'e'是添加的字母. 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Jav

Java [leetcode 14] Longest Common Prefix

小二好久没有更新博客了,真是罪过,最近在看linux的东西导致进度耽搁了,所以今晚睡觉前怒刷一题! 问题描述: Write a function to find the longest common prefix string amongst an array of strings. 解题思路: 该问题就是找到所有数组字符串里面的最长相同前字串.所以我的思路是先找到数组中最短的那个字符串,然后每次比较的时候最多循环该长度就行,这样避免字符串下标溢出的问题.设置StringBuilder对象用于存

[LeetCode][Java] Longest Common Prefix

题目: Write a function to find the longest common prefix string amongst an array of strings. 题意: 写出一个函数.找到一组数组中的最长公共子串. 算法分析: 须要构建两重循环.第一层是最短子串的长度,还有一层是遍历字符串数组中的每一个成员. brute force的想法,以第一个字符串为标准.对于每一个字符串从第一个字符開始,看看是不是和标准一致,假设不同,则跳出循环返回当前结果.否则继续下一个字符. AC

Longest Common Prefix之Java实现

一.题目 Write a function to find the longest common prefix string amongst an array of strings.If there is no common prefix, return an empty string "".Example 1: Input: ["flower","flow","flight"] Output: "fl"E

[LeetCode] 14. Longest Common Prefix 最长共同前缀

Write a function to find the longest common prefix string amongst an array of strings. 这题有好几种解法,个人认为会1,2的解法就可以了,但这种多方法解题的思路可以好好学习一下.具体可参考:Longest Common Prefix 1. 一个一个字符串取比较word by word matching: 先拿前2个,从第一位开始比较,直到发现有不同的字符,此时前面一样的字符串在去和后面的字符串比较,直到结束.可