原理比较简单,每一个字母的所有兄弟(一样的字母)都得在一起,那么我们先找到第一个字母,即s[0]的最后一个兄弟,比如下标为m,那么显然从0到他这最后一个兄弟m之间的字母必然也都在同一个串里了,那么中间这些字母就说了,你和兄弟在一起了,我们也要和兄弟在一起。所以再用一个循环遍历中间这部分字母,找到他们最后一个兄弟的位置,如果他们当中有人的最后一个兄弟的下标比m大,那就更新m,没办法,大家都要和兄弟在一起嘛!一圈下来之后m就是第一个串最后一个字母的下标了,那长度显然就是m+1。然后删掉这部分,继续循环上面部分就行了。然后代码的话就随便写写就可以了,string秒杀。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s;cin>>s;
    int js;
    while(!s.empty())
    {
        js=s.rfind(s[0]);
        for(int i=1;i<js;i++)
            if(s.rfind(s[i])>js)    js=s.rfind(s[i]);
        cout<<js+1<<" ";
        s.erase(0,js+1);
    }
}