A. 子串计算
题目描述
给出一个只包含0和1的字符串(长度在1到100之间),求其每一个子串出现的次数。
输入格式
一行,一个01字符串。
输出格式
对所有出现次数在1次以上的子串,输出该子串及出现次数,中间用单个空格隔开。
按子串的字典序从小到大依次输出,每行一个。
详解
定义一个 map ,用 string 映射 int
将输入的字符串进行枚举,再用 substr 去选取子串,累计每个子串出现的次数:
mp[s.substr(l,r-l+1)]++;
//选取区间[l,r]的字符,l为起点,r为终点,其中r-l+1为该区间内字符数量
由于 map 中的元素会根据键值自动实现排序,而不会受到存储顺序的影响,所以可以实现题目中的“按子串的字典序从小到大依次输出”
所以我们去遍历,大于1的直接输出:
map<string,int>::iterator it=mp.begin();
for(it=mp.begin();it!=mp.end();it++){
if(it->second>1){//判断该子串出现次数是否大于1
cout<<it->first<<" "<<it->second<<endl; //分别输出该子串以及该子串出现的次数
}
}
还是很简单的