字符串专题
1.统计单词频率
#include
#include
#include
#include
using namespace std;
int main()
{
string str;
while(getline(cin,str)){
int hashTable[26]={0};
int maxn=-1;
for(int i=0;i
#include
#include
#include
#include
#include
using namespace std;
int main()
{
string str;
int hashTable[26]={0};
int anum=0,wnum=0,cntMax=0;
while(cin>>str){
anum=anum+str.size();
wnum++;
for(int i=0;i
2.密文加密
#include
#include
#include
#include
using namespace std;
int main()
{
string str;
while(getline(cin,str)){
for(int i=0;i
cctype头文件中处理字符函数
[图片上传失败...(image-578378-1587804682906)]
3.find使用,删除指定子串,transform使用
对于字符串string,需要使用string头文件,包含以下常用方法:
s.find(str,[pos]):在字符串s中从第 pos 个字符开始寻找 str ,并返回位置,如果找不到返回-1。pos 可省略,默认为0
s.erase(pos,n):从给定起始位置 pos 处开始删除,要删除字符的长度为n,返回修改后的string对象
#include
#include
#include
#include
using namespace std;
int main()
{
string str;
while(cin>>str){
int pos=0;
string word="gzu";
//果然字符串还是得要用双引号稳妥,pos放在下面也更稳妥
while(str.find(word,pos)!=string::npos){
pos=str.find(word,pos);
str.erase(pos,3);
}
cout<>str){
int pos=0;
string word="gzu";
string temp=str;
transform(str.begin(),str.end(),str.begin(),::tolower);
//while ((pos = str1.find("gzu")) != -1)也可!!
while(str.find(word,pos)!=string::npos){
pos=str.find(word,pos);
str.erase(pos,3);
temp.erase(pos,3);
}
cout<
4.字符串前缀识别
#include
#include
using namespace std;
int main()
{
char str[100][100];
int n;
while (cin >> n&& n)
{
for (int i = 0; i < n; i++)
{
cin >> str[i];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j)continue;//比较不同字符串
if (str[i][0] == '@')continue;//已经修改过的就不用再判断了
bool flag = true;
for (int k = 0; k < strlen(str[i])&& flag; k++)
{
if (str[i][0] == '@')
flag = false;
if (str[i][k] != str[j][k])
flag = false;
}
if (flag)
{
str[i][0] = '@';
}
}
}
int ans = 0;
for (int i = 0; i < n; i++)
{
if (str[i][0] != '@')
ans++;
}
cout << ans << endl;
}
return 0;
}
给定字符串找出重复字符和位置,*号法
/*对于给定字符串,找出有重复的字符,并给出其位置*/
#include
#include
#include
using namespace std;
int main(){
string str;
while(cin>>str){
int len=str.size();
for(int i=0;i
5.string循环截取的两种办法
//记录当前位置截取法,有当前位置和新位置,不改变原来字符串
void CutString(string line,vector &subline,char a){
//a就是截取的标号
size_t pos=0;
while(pos
6.读入用户输入的,以“.”结尾的一行文字,统计一共有多少个单词
2、 #include
3、 #include
4、 int main(){
5、 char s[1000];
6、 int len,a[1000]={0},i,cnt;
7、 gets(s);
8、 len=strlen(s);
9、 printf("len=%d\n",len);
10、 cnt=0;//记录单词数;
11、 i=0;
//如果是这样计算就不要老想着for循环,while自己i++
12、 while(i
7.找出数组中最长无重复子串的长度
/*
输出一个整数,代表arr的最长无重复字符的长度。
不要和最长公共子串搞混,这个就是自己的子串
*/
#include
using namespace std;
int A[100001];
int main() {
int n; int length = 0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> A[i];
}
int start = 0; int i = 1;
while (i < n) {
int temp = 1;
for (int j = start; j < i; j++) {
if (A[j] == A[i]) {
start = j + 1;
}
else {
temp++;
}
if (temp > length)length = temp;
}
i++;
}
cout << length;
return 0;
}
方法二:
#include
#include
using namespace std;
int main()
{
int n;
cin>>n;
int *arr = new int[n];
for(int i = 0; i>temp;
arr[i] = temp;
}
int length =0;
int left = 0;
int right = 0;
unordered_set rec;
while (left < n && right < n)
{
int cur = arr[right];
//终于明白了,end()相当于a[n]指向最后一个后一个元素
if (rec.end() == rec.find(cur))
{
rec.insert(cur);
right++;
length = (right - left) > length?(right - left):length;
}
else
{ //没有指向最后一个,也就是说找到了!!,这个意思也就是起点需要后移
//如果一直都是找到的,那么就得一直后移
rec.erase(arr[left]);
left++;
}
}
cout<
8.手机键盘按键,find和hash办法
/*
手机键盘
*/
#include
using namespace std;
int main()
{
string arr[8]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
string str;
while(cin>>str){
int cnt=0;
for(int i=0;i
好方法:
1其实只需要一个数组就够用了啊。用key顺序记录26个字母按键次数,
2然后判断两个字母是否在同一个按键上,如果在同一个按键上,那么下标差(字母间距)
就等于按键次数差。
#include
#include
using namespace std;
int main()
{
int key[26] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4};
string str;
while(cin>>str)
{
int count = key[str[0]-'a'];
for(int i=1;i
9.给定一个0字符串,求出全部子串出现次数
/*map方法,自动按照字典序增序
使用substr轻松截取子串,为啥老是忘记了!!*/
#include
#include
using namespace std;
int main()
{
string s;
while(cin>>s){
map m;
for(int i=0;i<=s.size();i++){
for(int j=0;jsecond>1)
cout<first<<" "<second<
方法二:朴素手写方法
//一前一后两个指针来截取子串
#include
#include
#define N 5050
using namespace std;
struct STR{
string s;
unsigned cnt;
}buf[N]; //子串集合
int n; //子串数量
string str; //读取的字符串
string child; //临时存储子串
void MakeChild(int from,int len){
child.clear();
for(int i=0;i>str){
n=0; //子串个数
letsGo();
sort(buf,buf+n,cmp);
for(int i=0;i1){
cout<