原理比较简单,每一个字母的所有兄弟(一样的字母)都得在一起,那么我们先找到第一个字母,即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);
}
}