[LeetCode] 482ライセンスキーのフォーマット

説明

あなただけの英数字とダッシュで構成された文字列Sとして表さライセンスキーを与えられています。文字列は、NダッシュによってN + 1つのグループに分離されます。

数Kを考えると、我々は各グループがKよりも短くすることができ、それでも少なくとも一つの文字を含まなければならない最初のグループを除いて、正確にKの文字が含まれていることを、このような文字列を再フォーマットしたいと思います。さらに、2つのグループとすべて小文字大文字に変換されなければならない間に挿入ダッシュがなければなりません。

非空の文字列Sと数Kが与えられると、上述したルールに従って文字列をフォーマットします。

例1:

Input: S = "5F3Z-2e-9-w", K = 4

Output: "5F3Z-2E9W"

Explanation: The string S has been split into two parts, each part has 4 characters.
Note that the two extra dashes are not needed and can be removed.

例2:

Input: S = "2-5g-3-J", K = 2

Output: "2-5G-3J"

説明:文字列Sは、各部分は、前述したように、それは短くなる可能性があるので最初の部分を除いて2文字が含まれている3つの部分に分割されました。

注意:

  1. 文字列Sの長さが12,000を超えない、及びKは正の整数です。

  2. ストリングSは、英数字(AZ及び/又はAZおよび/または0-9)とダッシュで構成され( - )。

  3. 文字列Sは非空です。

分析

シリアル番号フォーマットにすべて大文字K基などの文字は、それぞれの間に-接続、の最初の組よりも小さくすることができるK文字

として

入力:S = "2〜5グラム-3-J"、K = 2

- >

出力: "2-5G-3J"

非常にシンプルなルックス、私はトラバーサル入力を逆に、次のコードを書いたS文字列の大文字の後のいずれかで新しいものを挿入し、各挿入のK追加を挿入する文字-

あなたが入力として長さが44153の文字列を入力するとすべてが、その後LeetCodeテスト、ノーマルに見えS、= k1は、メモリ制限を超え破った、とここで私はこの問題は、文字列の連結であると思いますが、それぞれがresult = "-" + result新しいを持っています最後超えるメモリを引き起こしたオブジェクト、

char toupper(char c) {
    return ('a' <= c && c <= 'z') ? c^0x20 : c;
}

string licenseKeyFormatting(string S, int K)
{
    string result;
    int tmp = 0;
    for(int i = S.length() - 1; i >= 0; i--)
    {
        if (S[i] == '-') continue;

        if (tmp++ == K)
        {
            result = "-" + result; // 问题应该来源于这里
            tmp = 1;
        }

        result = toupper(S[i]) + result;

        cout << tmp << " : " << result << endl;
    }

    return result;
}

新しいアイデアは、直接変更することでresult、初期化時に設定し、長さを文字列の連結ではありません、

char toupper(char c) {
    return ('a' <= c && c <= 'z') ? c^0x20 : c;
}

string licenseKeyFormatting(string S, int K) {
    int len = 0;
    int s_len = S.size();
    int *tag = new int[s_len]{0}; // 记录S中有字母或数字的位置

    for (int i = 0; i < s_len; i++)
    {
        if (S[i] == '-')
            continue;

        S[i] = toupper(S[i]);
        len++;
        tag[i] = 1;
    }

    len += (len - 1) / K;   // 计算最终结果的长度
    string result(len, '-');
    int pivot = len - 1;
    int tmp = 0;

    for (int j = s_len - 1; j >= 0; j--)
    {
        if (tag[j] == 1)
        {
            if (tmp++ == K)
            {
                pivot--;
                tmp = 1;
            }

            result[pivot--] = S[j];
        }
    }

    return result;
}
Runtime: 8 ms, faster than 97.11% of C++ online submissions for License Key Formatting.

Memory Usage: 10.9 MB, less than 34.48% of C++ online submissions for License Key Formatting.

おすすめ

転載: www.cnblogs.com/arcsinw/p/11329127.html