1.字符串匹配
思路:挨个找,做匹配。
代码
#include <iostream>
#include<algorithm>
#include<string>
#include<unordered_set>
using namespace std;
int main()
{
//利用set的特性统计数字个数
unordered_set<string> strMap;
string origin;
string dai_pei;
getline(cin,origin);
getline(cin,dai_pei);
int o_size = origin.size();
int d_size = dai_pei.size();
for (int i = 0; i < o_size - d_size + 1; i++) {
//origin的下标i滑动到等于dai_pei的第一个元素
if (origin[i] == dai_pei[0]||dai_pei[0]=='?') {
int count = 1;
for (int j = 1; j < d_size ; j++) {
//看是否与子串匹配
if (origin[i + j] == dai_pei[j] || dai_pei[j] == '?') {
count++;
}
else break;
}
if (count == d_size) {
strMap.insert(origin.substr(i, d_size)); //substr(i, d_size),从下标i开始截取长度为 d_size
}
}
}
cout << strMap.size() << endl;
system("pause");
return 0;
}
2.字符串组合
思路:利用set存放遍历后的结果。
#include <iostream>
#include<algorithm>
#include<string>
#include<set>
using namespace std;
//重新定义set里的排序规则
class classCompare {
//不要忘记写public:
public:
bool operator()(const string &a, const string &b) {
if (a.size() == b.size()) {
return a < b;
}
else {
return a.size() < b.size();
}
}
};
int main()
{
//利用set的特性统计数字个数
set<string, classCompare> strMap;
string a;
getline(cin, a);
for (int i = 0; i < a.size(); i++) {
string temp;
for (int j = i; j < a.size(); j++) {
temp = temp + a[j];
strMap.insert(temp);
}
}
//sort(strMap.begin(), strMap.end());
for (set<string> ::iterator it = strMap.begin(); it != strMap.end(); it++) {
cout << *it << " ";
}
system("pause");
return 0;
}
3.字符串分类
思路:将输入的字符串直接排序,然后借用set来存不同的可能,其中集合中size的大小就是最后的输出结果
#include <iostream>
#include<algorithm>
#include<string>
#include<set>
#include <vector>
using namespace std;
//将输入的字符串直接排序,然后借用set来存不同的可能,其中集合中size的大小就是最后的输出结果
int main()
{
int n;
cin >> n;
getchar();//吃掉空格
set<string> res;
//存字符串,存取时顺便排序
for (int i = 0; i < n; i++) {
string temp;
getline(cin, temp);
sort(temp.begin(), temp.end());
res.insert(temp);
}
cout << res.size() << endl;
system("pause");
return 0;
}
4.编程题2—最大连续的相同字符(复杂)
思路:
参考 https://blog.csdn.net/ansizhong9191/article/details/88365647
代码如下
#include <iostream>
#include<algorithm>
#include<string>
#include<set>
#include <vector>
using namespace std;
/*以b替换a为例,记录每一个b的位置,那么将连续m个b的置换为a必然存在最长的字串。//必定是连续最长
对索引为i的b而言,将前面m个b置换为a,此时索引为i的b与索引为i - m - 1的b之间的字串的长度为loc[i] - loc[i - m - 1] - 1。
初始化时,i从m + 1开始,因为前面不足m个b的时候,只要全部置为a即可。*/
int change(string a, char val,int m,int n) {
//当val='a'时,表示a被换成b
vector<int> num;
for (int i = 0; i < a.size(); i++) {
if (a[i] == val)
num.push_back(i);
}
num.push_back(n);//多加一位,且值必须为n
if (m >= num.size()) {
return a.size();
}
//滑动窗口,计算大小
//其中第一次循环是特殊情况,所以单独讨论,并将第一次设为最大值 max_number
int max_number = num[m];//[0,num[m]-1]区间个数
for (int i = m+1 ; i < num.size(); i++) {
max_number = max(max_number, num[i] - num[i - m - 1] - 1);//num[i] - num[i - m-1]-1=num[i]-1-(num[i-m-1]+1)+1
}
return max_number;
}
int main()
{
int n,m;
cin >> n>>m;
string a;
cin >> a;
int ret;
ret = max(change(a, 'a', m,n), change(a, 'b', m,n));
cout << ret << endl;
system("pause");
return 0;
}