给定一个只包含小写字母的字符串,我们通过如下规则分割它:
1.一个片段中包含的字符不允许出现在其他片段内。
2.分割的片段数应尽可能的多。
请实现一个函数,输出分割的片段。
例如:输入aabbbacceddefgkifk 输出为 aabbba cc edde fgkifk
【1】Vector
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。有点类似PHP里面的数组,可以动态向里面添加元素,不需要事先定义长度,而且可以放各种类型,不过要事先声明这个向量容器中放什么类型。
特点:
- 顺序序列
- 动态数组
- 能够感知内存分配器的(Allocator-aware)
定义:Vector<类型>标识符
操作:
void push_back(const T& x):向量尾部增加一个元素X
void pop_back():删除向量中最后一个元素
int size() const:返回向量中元素的个数
【2】substr
basic_string::substr(C++切割字符串函数)
basic_string substr(size_type _Off = 0,size_type _Count = npos) const;
参数
- 【_Off】所需的子字符串的起始位置。字符串中第一个字符的索引为 0,默认值为0。
- 【_Count】复制的字符数目
- 【返回值】一个子字符串,从其指定的位置开始
【3】Code
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
/**
例如aabbbabcc
lastWord存放 c=>8 a=>5 b=>6
*/
void SplitString(string S) {
int lastWord[26] = {};//用来存放 最后26个一个字母的位置
int i = 0;
int Slen = S.size();//切割的字符串长度
for( i=Slen - 1; i>=0 ; --i) {
if(lastWord[S[i] - 'a'] == 0 ) {//如果 没有存放
lastWord[S[i] - 'a'] = i;//赋值最后的位置 进去
}
}
vector<int> v;//用来存放 要截断的 下标位置
i = 0;
while(i < Slen) {
int j = i;
int max_last = lastWord[S[i] - 'a'];//最后字母的位置 比如a最后是5
while(j <= max_last) {
//每一次计算,当前的字母的最大长度,例如 b的最大长度是6
max_last = max(max_last, lastWord[S[j++] - 'a']);
} //那么最后就找到最大的长度是6 的子串
v.push_back(j);//压入一个元素
i = j ;
}
int number = 0;
for(i=0; i<v.size(); i++) {
cout<< S.substr(number,v[i]-number) << endl;//直接切割
number = v[i];
}
}
int main() {
string s = "aabbbacceddefgkifk";
SplitString(s);
return 0;
}