机试笔记4--字符串
字符串相关基础知识
默认在c++环境下,加入头文件#include <cstring>,如果要使用c的char str[]来表示字符串,输入一串字符串可以使用gets(),但不可以使用c++的getline
可以使用sort(str,str+strlen())来进行字符串排序。
也可以使用string str,加入头文件#include <string>,可以通过getline进行输入,排序则使用sort(str.begin(),str.end());来进行排序。
字符串查找函数,find(查找内容),未找到返回-1
题型1.统计字符
这里要注意的就是统计变量count要在每次统计完一个字符后清零。
题型2.大小写转换
对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。 在字符串中,单词之间通过空白符分隔,空白符包括:空格(' ')、制表符('\t')、回车符('\r')、换行符('\n')。
这道题要注意"如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。"也就是说可能有大写的情况,第一个字母和后面的字母要分开处理。
#include <iostream> #include <string> using namespace std; int main() { string str; while(getline(cin,str)){ for(int i=0;i<str.size();i++){ if(i==0&&'a'<=str[0]&&str[0]<='z') str[0]=str[0]-'a'+'A'; else { if(str[i-1]==' '||str[i-1]=='\t'||str[i-1]=='\r'||str[i-1]=='\n'){ if('a'<=str[i]&&str[i]<='z') str[i]=str[i]-'a'+'A'; } } } cout << str<<endl; } return 0; }
题型三.统计子串出现次数
#include <iostream> #include <string> using namespace std; int main() { string a,b; getline(cin,a); getline(cin,b); int sum_m=0; for(int i=0;i<b.size();i++){ int flag=0; for(int j=0;j<a.size();j++){ if(a[j]!=b[i+j]) flag=1; } if(flag==0) sum_m++; } cout << sum_m<<endl; return 0; }
题型四.字符串加密
编写加密程序,加密规则为:将所有字母转化为该字母后的第三个字母,即A->D、B->E、C->F、......、Y->B、Z->C。小写字母同上,其他字符不做转化。输入任意字符串,输出加密后的结果。
要注意的就是x到z的转化,第一种方法是
if(s[i]>'z') s[i]-=26;
第二种方法是
s[i] = 'a'+(s[i]+3-'a')%26;
题型四.字符串删除
#include <iostream> #include <string> #include <vector> using namespace std; int main() { string a,b; getline(cin,a); getline(cin,b); int index[105]={0}; for(int i=0;i<b.size();i++){ int flag=0; for(int j=0;j<a.size();j++){ if(a[j]!=b[i+j]){ flag=1; } } if(flag==0){ for(int k=i;k<i+a.size();k++) index[k]=1; } } for(int i=0;i<b.size();i++) { if(index[i]==0) cout << b[i]; } cout << endl; return 0; }
如果题目要求不区分大小写,一律删除,可以先把字符串转化成全小写,再进行
for(int i=0;i<b.size();i++){ if('A'<=b[i]&&b[i]<='Z'){ btype[i]=b[i]-'A'+'a'; } else btype[i]=b[i]; }
将一个字符串中的某个单词替换成另一个单词
#include<iostream> #include<cstring> #include<string> #include<vector> using namespace std; int main() { string s, a, b; vector<string> v; do {//分割单词填装进vector中,当输入回车就结束循环 cin >> s; v.push_back(s); } while (cin.get() != '\n'); cin >> a >> b;//接收待替换字符串和要替换成的字符串 for (int i = 0;i < v.size();i++) {//开始遍历vector,并输出 if (v[i] == a) {//是目标字符串就替换掉 v[i] = b; } if(i != v.size() - 1){//完成操作后开始输出,这里注意空格问题 cout << v[i] << " "; } else { cout << v[i]; } } return 0; }
例题,输出不同的字符串
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; set<string> s; while(n--){ string str; cin>>str; s.insert(str); } cout<<s.size()<<endl; }
可以利用set来计算,如果还要知道各个相同的字符串的个数,可以使用map