その日の1つの質問をLeetcode:763.partition-labels(パーティション文字間隔)

ここに写真の説明を挿入
考え方は大まかに次のとおりです。与えられた文字列Sについて、同じ文字が同じ部分にのみ表示されるように、それをいくつかの部分に分割します。

アイデア:最初に文字列をスキャンし、各文字の最後の位置を記録してから、ダブルポインター文字列をトラバースし、変数end設定して、分離されたサブストリングの最後にSの添え字を示し、変数startを設定して、サブストリングの先頭にあるSの添え字示します。現在スキャンされている要素が最後に出現した場合の添え字がendより大きい場合は、部分文字列を拡張する必要がある
ことを意味します。Endが更新されます。現在スキャンされている要素の添え字がendに達した場合は、その部分文字列が要件と回答(サブ文字)を完全に満たしていることを意味します。文字列end-start+1の要素数がresに追加されstart=end+1、次のサブ文字列の先頭を指すようにしながら、操作を繰り返します。
ここに写真の説明を挿入
ここに写真の説明を挿入

vector<int> partitionLabels(string S)
{
    
    
    unordered_map<char, int> m;
    vector<int> v;
    int len = S.size();
    //记录记录字母最后一次出现的位置
    for (int i = 0; i < len; i++)
    {
    
    
        m[S[i]] = i;
    }
    int start = 0, end = 0;
    for (int i = 0; i < len; i++)
    {
    
    
        end = max(end, m[S[i]]);
        if (i == end) //如果i遍历到end(即该部分字符串的结尾),说明该子字符串已符合要求,那么改变start的值对下一部分字符串遍历;
        {
    
    
            v.push_back(end - start + 1);
            start = i + 1;
        }
    }
    return v;
}

おすすめ

転載: blog.csdn.net/wyll19980812/article/details/109214783