描述
题目描述
给出一个01字符串(长度不超过100),求其每一个子串出现的次数。
输入描述:
输入包含多行,每行一个字符串。
输出描述:
对每个字符串,输出它所有出现次数在1次以上的子串和这个子串出现的次数,输出按字典序排序。
示例1
输入
10101
输出
0 2
01 2
1 3
10 2
101 2
分析
确实是需要一小段一小段来查
考虑两个问题:如何查找子串;如何保证不遗漏子串;要最后保证字典序排序
map 可以用string做键;用find查找有无string;用值表示次数;本身是字典序
不遗漏子串,就从第一个字母开始遍历,每次从当前位置依次往后加一个,就是正常的计数所有可能子串的思路
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
using namespace std;
map<string, int>com;
map<string, int>::iterator it;
int main()
{
string input;
while (cin>>input)
{
int len = input.length();
string c="";
com.clear();
for (int i = 0; i < len; i++)
{
c = "";
c += input[i];
if (com.find(c) != com.end())
com[c]++;
else
com[c] = 1;
for (int j = i + 1; j < len; j++)
{
c += input[j];
if (com.find(c) != com.end())
com[c]++;
else
{
com[c] = 1;
}
}
}
for (it = com.begin(); it != com.end(); it++)
{
if ((*it).second > 1)
cout << (*it).first << " " << (*it).second << "\n";
}
}
}
收获
有段时间不用map了,但其实挺好用的
map < string,int>mapp;
第一个是key,第二个是value, key按顺序的,不重复;可以直接用中括号索引key得到value
可以根据key值快速查找
插入:
mapStudent.insert(pair< int, string>(1, “student_one”)); 或者直接
mapStudent[1] = “student_one”;
第一种插入在有key值时不会插入,第二种会覆蓋原来的值
map.size()返回当前插入了多少数据
遍历
map< string,int>::iterator it;
for(it = mapp.begin();it!=mapp.end();it++)
(*it).first —-key (*it).second —value;
或者
for(int i = 0;i< mapp.size();i++)
mapp[i]访问int键的值;具体for循环的开始结束取决于int键值,一般不用
查找
mapp.count(key)判断有没有,要么1要么0
mapp.find()返回的是数据所在位置迭代器,只要!=mapp.end()就是找到了
mapp.clear()清空map
mapp.empty()是否为空