LeetCode]最大公約数文字列文字列(イージー)の[1071最大公約数(JAVA)

LeetCode]最大公約数文字列文字列(イージー)の[1071最大公約数(JAVA)

トピック住所:https://leetcode.com/problems/greatest-common-divisor-of-strings/

件名の説明:

文字列SとTのために、我々はS = T + ... + T(Tは、それ自体で1回以上連結された)場合にのみ、「TはSを分割」と言います

XはSTR1を分割し、X格差str2のような最大の文字列Xを返します。

例1:

Input: str1 = "ABCABC", str2 = "ABC"
Output: "ABC"

例2:

Input: str1 = "ABABAB", str2 = "ABAB"
Output: "AB"

例3:

Input: str1 = "LEET", str2 = "CODE"
Output: ""

注意:

1. 1 <= str1.length <= 1000
2. 1 <= str2.length <= 1000
3. str1[i] and str2[i] are English uppercase letters.

効果の対象に

文字列SとT、唯一のS = T + ... +時間T(Tは、それ自体に1回以上接続されている)のために、私たちは「T Sを割り切れることができます。」識別しました

戻り値は、最長の文字列X、Xは、要件を満たすことができ、そしてXは割り切れ割り切れstr1はstr2をすることができます。

問題解決のアプローチ

一般的な方法は、共通因子を見つけるトラバースすることです

class Solution {
    public String gcdOfStrings(String str1, String str2) {
        if (str1.length() == 0 || str2.length() == 0) return "";
        int start = 0;
        for (; start < str1.length() && start < str2.length(); start++) {
            if (str1.charAt(start) != str2.charAt(start)) break;
        }
        if (start <= 0) return "";
        if (str1.length() < str2.length()) {
            String temp = str1;
            str1 = str2;
            str2 = temp;
        }
        for (int i = start - 1; i >= 0; i--) {
            if (str1.length() % (i + 1) != 0 || str2.length() % (i + 1) != 0 || !str2.equals(str1.substring(0, str2.length()))) continue;
            String temp = str1.substring(0, i + 1);
            int j = 1;
            for (; (j + 1) * (i + 1) <= str1.length() || (j + 1) * (i + 1) <= str2.length(); j++) {
                if ((j + 1) * (i + 1) <= str1.length()) {
                    if (!temp.equals(str1.substring(j * (i + 1), (j + 1) * (i + 1)))) break;
                }

                if ((j + 1) * (i + 1) <= str2.length()) {
                    if (!temp.equals(str2.substring(j * (i + 1), (j + 1) * (i + 1)))) break;
                }
            }

            if ((j + 1) * (i + 1) > str1.length() && (j + 1) * (i + 1) > str2.length()) return temp;
        }
        return "";
    }
}

実行時:4ミリ秒、のJavaに提出するすべてのユーザーの28.07パーセントを打つ
メモリ消費量:39メガバイト、Javaで提出するすべてのユーザの8.80パーセントを打ちます

練習の偉大な神の後ろに見えたのランキングを見て、私たちは、このアプローチは時間がかかりすぎるであることを知って、

class Solution {
    public String gcdOfStrings(String str1, String str2) {
        if (!(str1 + str2).equals(str2 + str1)) return ""; 
        return str1.substring(0, gcd(str1.length(), str2.length()));
    }

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

実行する場合:1ミリ秒、のJavaに提出するすべてのユーザーの93.63パーセントを打つ
メモリ消費量:38.4メガバイトは、Javaで提出するすべてのユーザーの10.40パーセントを破りました

公開された81元の記事 ウォンの賞賛6 ビュー2282

おすすめ

転載: blog.csdn.net/qq_16927853/article/details/104811152