# Leetcode 14 : 가장 긴 공통 접두어 긴 일반적인 접두사

공개 번호 : 사랑 버그 쓰기

문자열 배열 사이 가장 긴 공통 접두어 문자열을 찾는 함수를 작성합니다.

공통 접두사가없는 경우 빈 문자열을 반환 "".

가장 긴 공통 접두어 문자열 배열을 발견하는 함수를 작성합니다.

공통 접두사가없는 경우에는 빈 문자열을 반환합니다 "".

예 1 :

Input: ["flower","flow","flight"]
Output: "fl"

예 2 :

Input: ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.

노트 :

모든 주어진 입력은 소문자에있다 a-z.

설명 :

모든 입력은 소문자가 들어 있습니다 a-z.

문제 해결 아이디어 자바 :

아주 간단하고 아주 고전적인 질문, 나는 첫 번째 문자열 그룹 문자열 유형을 숯불 것을 처음에 생각했다. 모두 StringBuilder는 같은 문자를 사용하여 하나 하나 축적. 문자열의 길이를 변화, 당신은 문자열의 길이 트래버스 최소를 찾을 수 있기 때문에, 나는 통과하는 시간을 단축, 캐스트의 잘못된 형태를 선택했다.

코드 :

class Solution {
    public String longestCommonPrefix(String[] strs) {
        int strLen=strs.length;
        if(strLen==0) return "";//空字符串组返回""
        char[] temp=strs[0].toCharArray();
        StringBuilder str = new StringBuilder();
        for (int i=0;i<strs[0].length();i++){//以第一个字符串长度开始比较
            for (int j=1;j<strLen;j++){
                try {
                    if(temp[i]!=strs[j].charAt(i)){
                        return str.toString();
                    }
                }catch (IndexOutOfBoundsException e){//抛出错误,这里错误是指索引超出字符串长度
                    return strs[j];
                }
            }
            str.append(temp[i]);
        }
        return strs[0];
    }
}

자바 뒤에 생각하는이 subString()방법은, 당신은 문자열 차단, 아니 턴의 길이를 지정할 수 있습니다 char[]유형을하지만,이 방법은 위의 Leetcode하지만 빨리하지 작업을 제출하는 경우,이 또한 연산자 오버로딩을 지원하지 않는 자바, 사용하는 것을 보여줍니다 substring()새로운 문자열마다 문자열, 효율이 높지 않다.

마지막 방법을 참조 일반적인 생각을 사용하기 때문에, 문자열, 문자열 차단 하강의 최소 길이를 찾을 수 있습니다 subString()문제가 가장 긴 접두사 대중을 찾을 수 있기 때문에 방법을, 그것은 하강, 다시 전면에서 더 낫다 높은 효율. 특정보기 :

 public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length==0) return "";
        int min=Integer.MAX_VALUE;
        String minStr="";
        for(int i=0;i<strs.length;i++){//找出最小长度字符串
            if(min>strs[i].length()){
                minStr=strs[i];
                min=strs[i].length();
            }
        }
        if(min==0) return "";
        for(int i=min;i>=0;i--){//最小长度字符串从长到短截取
            String standard=minStr.substring(0, i);
            int j=0;
            for(j=0;j<strs.length;j++){
                if(strs[j].substring(0, i).equals(standard)) continue;
                else break;
            }
            if(j==strs.length) return standard;
        }
        return "";
    }
}

원래 코드 링크 : https://blog.csdn.net/qq_14927217/article/details/72955791

문제 해결 아이디어 py3 :

편의적 다시을 os.path 래퍼 함수 commonprefix()한 단계이다.

코드 :

class Solution(object):
    def longestCommonPrefix(self, strs):
        import os
        return os.path.commonprefix(strs)

사실,이 기능을 사용하는 것입니다 비교 ASCll 코드 의 소스 코드를 작성하는 특성 :

def commonprefix(m):
    "Given a list of pathnames, returns the longest common leading component"
    if not m: return ''
    # Some people pass in a list of pathname parts to operate in an OS-agnostic
    # fashion; don't try to translate in that case as that's an abuse of the
    # API and they are already doing what they need to be OS-agnostic and so
    # they most likely won't be using an os.PathLike object in the sublists.
    if not isinstance(m[0], (list, tuple)):
        m = tuple(map(os.fspath, m))
    s1 = min(m)
    s2 = max(m)
    for i, c in enumerate(s1)://枚举得到s1的每一个字符及其索引
        if c != s2[i]:
            return s1[:i]
    return s1

그럼에도 불구하고, py3이 코드의 실행 속도는 여전히 자바보다 훨씬 느립니다.

참고 : ASCll 코드 비교 크기와 크기 비교, 그렇지 않은 경우 문자 바로 뒤에 얻은 결과의 같은 크기 비교되지 않은 첫 번째 문자 문자열에서 모든 문자의 비교 ASCll 축적에 따라되지 않습니다.

추천

출처www.cnblogs.com/zhangzhe532/p/11105341.html