LeetCode (6) : 가장 긴 공통 접두사

이야기

string 형 배열에서 가장 긴 공통 접두사 문자열을 찾는 함수 작성

예 : 문자열 배열 : leets leetcode leet leeds

일반적인 접두사 문자열은 Lee입니다.

아이디어 1

1. 첫 번째 것과 두 번째 것을 비교하고 가장 긴 것, 즉 leet를 찾으십시오
. 2. 다음 것, 아직 leet 인 경우 다음 문자열을 비교하고, leet가 아닌 경우 마지막 숫자를 제거하여 얻으십시오. 리, 비교

여기에 사진 설명 쓰기

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;
}

이 아이디어는 두 가지 점을 학습합니다.
1. 첫 번째 문자열을 접두어로
사용 하여 하나씩 비교하는 대신 두 번째 문자열과 비교합니다 . 2. strs [i] .indexof (prefix)를 사용하여 0과 같게 만듭니다. 접두사를 판단하는 기준으로 매우 영리합니다.

아이디어 2

1. 세로 비교, 첫 번째 문자열의 첫 번째 문자를 꺼내 다음 세 문자열 중 첫 번째 문자열과 비교합니다. 모두 같으면 불평등이있을 때까지 두 번째 문자를 비교하기 시작합니다
. 이 비교 방법은 슬라이딩 커서가있는 것 같고, 움직일 때 조건이 맞지 않을 때 0과 커서 사이의 문자를 가로 채서 원하는 값입니다.

여기에 사진 설명 쓰기

public String longestCommonPrefix(String[] strs) {
    if (strs == null || 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 (i == strs[j].length() || strs[j].charAt(i) != c)
                return strs[0].substring(0, i);             
        }
    }
    return strs[0];
}
아이디어 3- 분할 및 정복

여기에 사진 설명 쓰기

아이디어 : 두 개로 나누고 가장 긴 접두사를 따로 찾은 다음 두 접두사에서 마지막 답을 찾습니다.

  public static String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) return "";
        return longestCommonPrefix(strs, 0 , strs.length - 1);
    }

    private static String longestCommonPrefix(String[] strs, int l, int r) {
        if (l == r) {
            return strs[l];
        }
        else {
            int mid = (l + r)/2;
            String lcpLeft =   longestCommonPrefix(strs, l , mid);
            String lcpRight =  longestCommonPrefix(strs, mid + 1,r);
            return commonPrefix(lcpLeft, lcpRight);
        }
    }

     static  String  commonPrefix(String left,String right) {
        int min = Math.min(left.length(), right.length());
        for (int i = 0; i < min; i++) {
            if ( left.charAt(i) != right.charAt(i) )
                return left.substring(0, i);
        }
        return left.substring(0, min);
    }

마지막 코드를 잘 이해하고 여기에 먼저 기록해야합니다.

추천

출처blog.csdn.net/cd18333612683/article/details/79306737