LeetCode.1071- 문자열 최대 공약수 (문자열의 최대 공약수)

이것은 제 오가와입니다 (391) , 제 업데이트 421 피안 원래

01 질문과 준비보고

소개 오늘은 LeetCode의 제목 알고리즘 쉬운 수준 (253 개) 질문 (전체 타이틀 번호는 1071 ). 문자열의 경우 ST, 경우에만 S = T + ... + T( T자신에 한 번 이상 연결시), 우리는 말한다 "T除S".

가장 큰 문자열을 반환 분할 , 분열 .XXstr1Xstr2

예를 들면 :

입력 : STR1 = "ABCABC"STR2 = "ABC"
출력 "ABC"

입력 : STR1 = "ababab와"과 str2 = "ABAB"
출력 : "AB"

입력 : STR1 = "LEET"과 str2 = "CODE"
출력 : ""

참고 :

  • 1 <= str1.length <= 1000

  • 1 <= str2.length <= 1000

  • str1[i]그리고 str2[i]대문자입니다.

제 02 해결

두 문자열을 요구하는 타이틀 식별하는 str1, str2최대 공약수,, 즉 str1, str2문자열 양자의 존재하에, 하나 이상의 회 이루어지는 문자열로 반복했다.

그래서, 어떤 상황에서 두 문자열의 어떤 최대 공약수가 없다?

전에 각 접합 후,하지만 동일하지 둘, 그것은 확실히 최대 공약수가 존재하지 않는 것입니다. 예를 들어, 상기 예에서 str1 ="ABCABC", str2 ="ABC", str1스플 라이스 str2후의하게 "ABCABCABC", str2접합은 str1후된다 "ABCABCABC". 그리고 str1 ="LEET", str2 ="CODE", str1바느질은 str2후하게 "LEETCODE", str2접합은 str1후하게 "CODELEET", 모두는 분명히 동일하지, 확실히 더 공약수가 없습니다.

그것이 그들이 그것의 최대 공약수를 찾는 방법은?

아이디어 : 문자열 분할로. 각각 상이한 서브 스트링 str1str2의해 분할 분할은 어떤 요소 남아 있지 않은 경우에있어서의 구현에서는, 스트링의 배열은 상기 스트링을 나눌 수 있음을 나타낸다. 실측치 개의 작은 문자열 길이,주기 수의 상한은, 연속적으로, 문자열 취출이면 문자열에서 찍은 분할 배열의 길이가 광학적 0 해결되었는지 세부 후, 문자열은 최대 공약수이다.Stringsplitstr1str2

public String gcdOfStrings(String str1, String str2) {
    if (!(str1+str2).equals(str2+str1)) {
        return "";
    }
    int n = Math.min(str1.length(), str2.length());
    for (int i=n; i>=1; i--) {
        String temp = str2.substring(0, i);
        if (str2.split(temp).length == 0 && 
                str1.split(temp).length == 0) {
            return temp;
        }
    }
    return "";
}


03 제 2 용액

여전히 속성의 캐릭터를 이용하여 첫 번째 솔루션과 유사한 아이디어는, 최대 공약수의 사용에 의해, 교체를 확인합니다 방법.StringreplaceAll

public String gcdOfStrings2(String str1, String str2) {
    if (!(str1+str2).equals(str2+str1)) {
        return "";
    }
    int n = Math.min(str1.length(), str2.length());
    for (int i=n; i>=1; i--) {
        if (n%i != 0) {
            continue;
        }
        String temp = str2.substring(0, i);
        if(str1.replaceAll(temp,"").equals("") && 
                str2.replaceAll(temp,"").equals("")) {
            return temp;
        }
    }
    return "";
}


04 세 번째 용액

우리는 또한보기의 수학적 관점에서 문제에 대해 생각할 수 있습니다.

아이디어 : 본 문자열의 길이는 두 개의 가장 큰 두 개의 작은 문자열 길이를 가지고 두 개의 정수, 두 개의 숫자, 최대 공약수가 계산의 최대 공약수를위한 단일 쓰기 알고리즘의 공약수 촬영 문자열은 문자열의 길이는 문자열이 문자열의 우리의 마지막 두 전공이 반환되는, 최대 공약수를 계산하기 이전 단계입니다.

public String gcdOfStrings3(String str1, String str2) {
    if (!(str1+str2).equals(str2+str1)) {
        return "";
    }
    int len = str1.length();
    int len2 = str2.length();
    int gcd = GCD(len, len2);
    if (len < len2) {
        return str1.substring(0, gcd);
    }
    return str2.substring(0, gcd);
}


public int GCD(int a, int b) {
    if (b == 0) {
        return a;
    }
    return a % b == 0 ? b : GCD(b, a % b);
}


제 05 용액

우리는 또한 세 번째 재귀 방법의 최대 공약수에 사용되는 솔루션 및 문자열 연산과 통합 할 수 있습니다.

그 중 하나가 될 때까지 두 문자열의 작은 길이가 더 큰 문자열에 교체로 문자열의 큰 길이, 모든 문자가 문자열은 문자열의 큰 길이보다 작은 길이를 포함하는 경우 발견 빈 문자열까지.

public String gcdOfStrings4(String str1, String str2) {
    if (str1.length() < str2.length()) {
        return gcdOfStrings4(str2, str1);
    }
    if (str2.isEmpty()) {
        return str1;
    }
    if (!str1.contains(str2)) {
        return "";
    }
    str1 = str1.replace(str2, "");
    return gcdOfStrings4(str2, str1);
}


06 요약

주제 알고리즘은 계속되었습니다 일 이상 칠개월 , 특집 기사의 알고리즘 259 개 + 기사, 대중 번호 대화 상자 응답 [ 자료 구조와 알고리즘 ], [ 알고리즘 ], [ 데이터 구조 ] 중 기사 컬렉션 시리즈를 얻을 수있는 키워드 .

즉, 당신이 어떤 좋은 해결책 아이디어, 제안 또는 기타 문제가있는 경우, 아래 의견, 엄지 손가락을 교환 할 수 있습니다, 전부, 메시지 전달 및 지원은 나에게 가장 큰 보상이다!

추천

출처www.cnblogs.com/xiaochuan94/p/11235674.html