区切られた文字列は、文字の同じ種類が一緒に表示されるようにします
Input: S = "ababcbacadefegdehijhklij"
Output: [9,7,8]
Explanation:
The partition is "ababcbaca", "defegde", "hijhklij".
This is a partition so that each letter appears in at most one part.
A partition like "ababcbacadefegde", "hijhklij" is incorrect, because it splits S into less parts.
件名の説明:
この質問は、私たちのサブストリングの最大に表示できる各文字をそれからできるだけ多くのサブ文字列に分割された文字列sを与える、問題を解決することの難しさは、文字列を見つけることですブレークポイントは、ストリングの分割位置は、我々は密接に見て例のタイトルは、あなたがそれを一度に数回は、その位置は、現在のサブに現れ、最後でなければならない文字があったかもしれ手紙、電子とj個の部分文字列は3つの文字の終わりです。私たちの懸念は、各文字の最後に現れる場所ですので、私たちはその最後に出現する各文字と位置を保存するためにマップを使用することができます。
あなたがマップを作成した後、我々は文字列s、我々はスタートの変数を維持横断し、現在のサブストリングの開始位置で、最後の変数があり、我々は手紙に行き来するたびに、ストリングの現在位置の終わりで、我々マップは、すぐに文字を含む文字列として、文字がすべて同じが含まれている必要があり、それが表示される最後の位置から抽出し、そのときにのみ、私たちは、最後の変数現在の文字の添字で最後の更新を維持する必要がありますそして、最後の時間に等しく、それは切断部分文字列の現在の場所です。
コード:
class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer>res=new ArrayList<>();
if(S==null||S.length()==0)
return res;
int []map=new int [26]; //记录每个字母出现的最后一个下标
for(int i=0;i<S.length();i++){
map[S.charAt(i)-'a']=i;
}
int start=0;
int last=0;
while(start<S.length()){
int i=start;
while(i<S.length()){
last=Math.max(last,map[S.charAt(i)-'a']);//取访问到的字母的最大最后一个坐标更新last
if(last==i){
res.add(i-start+1);
start=i+1;
break;
}
i++;
}
}
return res;
}
}