zoukankan      html  css  js  c++  java
  • longest common prefix

    1. Question

    找字符串数组的最长公共前缀,是所有字符串的。

    Write a function to find the longest common prefix string amongst an array of strings.

    2. Solution(O(mn))

    以第一个字符串作为前缀初值(前缀不可能比它要长,可以优化采用长度最短的字符串为初值字符串),遍历所有字符串,求当前字符串与前缀变量的公共前缀,作为新的前缀变量。

    考虑特殊情况:数组为空或数组长度为0

    import java.util.Arrays;
    import java.util.LinkedList;
    
    public class Solution {
        //O(mn)
        public String longestCommonPrefix(String[] strs){
            if( strs.length == 0 )
                return "";
            
            int len = strs[0].length();
            int k = 0;
            for( int i=1; i<strs.length; i++ )
                if( strs[i].length() < len ){
                    len = strs[i].length();
                    k = i;
                }
            String prefix = strs[k];
            for( int i=0; i<strs.length; i++){
                if( !strs[i].startsWith( prefix ) ){
                    prefix = prefix.substring(0, prefix.length()-1 );
                    i--;
                }
            }
            return prefix;
        }
    }
    View Code

    或者一个一个比较:

    import java.util.Arrays;
    import java.util.LinkedList;
    
    public class Solution {
        //O(mk)
        public String longestCommonPrefix(String[] strs){
            if( strs.length == 0 )
                return "";
    
            int k = 0;
            for( int i=1; i<strs.length; i++ )
                if( strs[i].length() < strs[k].length() )
                    k = i;
            
            int len = strs[k].length();
            int i;
            for( i=0; i<len; i++ ){
                boolean judge = true;
                for( int j=0; judge && j<strs.length; j++ )
                    judge = judge && ( strs[j].charAt(i) == strs[k].charAt(i) );
                if( judge == false )
                    break;
            }
            return strs[k].substring(0, i);
        }
    }
    View Code

    也可以用递归,即最长公共前缀是前n-1个字符串的最长公共前缀与最后一个字符的最长公共前缀:

    import java.util.Arrays;
    import java.util.LinkedList;
    
    public class Solution {
        //use iteration, O(n2)
        public String longestCommonPrefix(String[] strs){
            if( strs.length == 0 )
                return "";
            if( strs.length == 1 )
                return strs[0];
            return longestCommonPrefix( new LinkedList<String>( Arrays.asList( strs ) ) );        
        }
        
        public String longestCommonPrefix( LinkedList<String> strs ){
            if( strs.size() == 2){
                String s1 = strs.getFirst();
                String s2 = strs.getLast();
                int len = (s1.length() < s2.length()) ? s1.length() : s2.length();
                int i = 0;
                for( ; i<len && s1.charAt(i) == s2.charAt(i); i++);
                return s1.substring(0, i);
            }
            
            LinkedList<String> temp = new LinkedList<String>();
            temp.add( strs.removeLast());
            temp.add( longestCommonPrefix(strs) );
            return longestCommonPrefix( temp );
        }
    }
    View Code
  • 相关阅读:
    [直播]WordLock——英文单词锁
    一些Shell的好东西
    Linux下的词典——GoldenDict
    Android重写onOreate,onPause,onStop等方法时需要注意的问题!
    [记录]我的Android工程——SelectToDo
    [FZYZOI比赛]T1256 20130322 (动态规划) 黄地产的生活
    Android使用DOM来编辑XML时遇到的问题——无法保存
    在Java下使用DOM来读取/修改Xml文件
    没来得及整理的一些网站
    Android的一些函数或关于它们用法的函数
  • 原文地址:https://www.cnblogs.com/hf-cherish/p/4596517.html
Copyright © 2011-2022 走看看