HENAU冬令营 字符串专题

A - 雷同检测

从头开始遍历,遇到相同的字符就输出下标,遍历到相对较短的字符串。

空间复杂度O(1),时间复杂度O(n)

代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
	string str1;
	string str2;
	getline(cin,str1);
	getline(cin,str2);
	for(int i=0;i<min(str1.size(),str2.size());i++){
		if(str1[i]==str2[i]){
			cout<<i+1<<" ";
		}
	}
	return 0;
}

B - 首字母大写

遍历字符串,判断第一个字母和前一个是空格的字母是否是小写,如果是小写就转换为大写

空间复杂度O(1),时间复杂度O(n)

代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
	string str;
	getline(cin,str);
	for(int i=0;i<str.size();i++){
		if(i==0&&str[i]>='a'){
			str[i]-=32;
		}
		if(i>0&&str[i-1]==' '&&str[i]>='a'){
			str[i]-=32;
		}
	}
	cout<<str;
	return 0;
}

C - 大小写转换

遍历字符串,遇到小写字母就转换为大写字母

空间复杂度O(1),时间复杂度O(n)

#include <bits/stdc++.h>
using namespace std;
int main(){
	string str;
	while(cin>>str){
		for(int i=0;i<str.size();i++){
			if(str[i]>='a'&&str[i]<='z'){
				str[i]-=32;
			}
		}
		cout<<str<<endl;
	}
	return 0;
}

D - 数字反转

先判断是正数还是负数,然后利用reverse函数和stoi函数,把字符串反转并把字符串转换为int类型

空间复杂度O(1),时间复杂度O(n)

#include <bits/stdc++.h>
using namespace std;
int main(){
	string num;
	cin>>num;
	int a;
	if(num[0]=='-'){
		reverse(num.begin()+1,num.end());
		a=stoi(num);
	}
	else{
		reverse(num.begin(),num.end());
		a=stoi(num);
	}
	cout<<a;
	return 0;
} 

E - 删除单词后缀

利用find函数进行查找,再利用substr函数进行截取

空间复杂度O(1),时间复杂度O(n2)

#include <iostream>
#include <string>
using namespace std;
string s;
int main(){
    cin >> s;
    if (s.find("er", s.size()-2) != -1)
        s = s.substr(0, s.size()-2);
    else if (s.find("ly", s.size()-2) != -1)
        s = s.substr(0, s.size()-2);
    else if (s.find("ing", s.size()-3) != -1)
        s = s.substr(0, s.size()-3);

    cout << s << endl;
    return 0;
}

F - 判断字符串是否为回文

利用reverse函数进行反转,然后判断反转后和反转前是否一样

空间复杂度O(1),时间复杂O(n)

#include <bits/stdc++.h>
using namespace std;
int main(){
	string str;
	cin>>str;
	string temp=str;
	reverse(str.begin(),str.end());
	if(temp==str){
		cout<<"yes";
	}
	else{
		cout<<"no";
	}
	return 0;
} 

G - 基础数据结构——栈(1)

遍历字符串,遇到   {,(, [    就入栈,遇到了   },   ),   ]   就出栈

空间复杂度O(n),时间复杂度O(n)

#include <bits/stdc++.h>
using namespace std;
int main(){
	string str;
	while(getline(cin,str)){
		stack<char> s;
		for(int i=0;i<str.size();i++){
			if(str[i]=='('||str[i]=='['||str[i]=='{') 
				s.push(str[i]);
			else if(str[i]==')'||str[i]==']'||str[i]=='}'){
				if(s.empty()) 
				{
					s.push(str[i]); 
					break;
				} 
				if(str[i]==')'&&s.top()=='(') s.pop();
				else if(str[i]==']'&&s.top()=='[') s.pop();
				else if(str[i]=='}'&&s.top()=='{') s.pop();
			}
		}
		if(s.size()) cout<<"no"<<endl;
		else cout<<"yes"<<endl;
	}
	return 0;
}

H - 字典序

直接进行比较,C++内部重载了string的比较的函数

空间复杂度O(1),时间复杂度O(n)

#include <bits/stdc++.h>
using namespace std;
int main(){
	string str1,str2;
	getline(cin,str1);
	getline(cin,str2);
	if(str1<str2){
		cout<<"YES";
	}
	else cout<<"NO";
	return 0;
}

I - 验证子串

利用find函数进行查找

空间复杂度O(1),时间复杂度O(n2)

#include <bits/stdc++.h>
using namespace std;
int main(){
	string str1;
	string str2;
	cin>>str1>>str2;
	if(str2.find(str1)!=string::npos) cout<<str1<<" is substring of "<<str2<<endl;
	else if(str1.find(str2)!=string::npos) cout<<str2<<" is substring of "<<str1<<endl;
	else cout<<"No substring"<<endl;
	return 0;
}

J - 子串查找

kmp算法,注意可重叠

空间复杂度O(n),时间复杂度O(n+m)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define maxn 1000005
using namespace std;
char text[maxn], patten[maxn];
int net[maxn];
int main() {
	scanf("%s%s",text,patten);
	int la = strlen(text);
	int lb = strlen(patten);
	memset(net, 0, sizeof(net));
	for (int i = 1; i < lb; ++i) {
		int j = i;
		while (j > 0) {
			j = net[j];
			if (patten[j] == patten[i]) {
				net[i + 1] = j + 1;
				break;
			}
		}
	}
	int cnt = 0;
	for (int i = 0, j = 0; i < la; ++i) {
		if (j < lb&&patten[j] == text[i]) {
			j++;
		}
		else {
			while (j > 0) {
				j = net[j];
				if (text[i] == patten[j]) {
					j++;
					break;
				}
			}
		}
		if (j == lb) cnt++;
	}
	printf("%d\n", cnt);
	return 0;
}

K - 剪花布条

kmp,不重叠

空间复杂度O(n),时间复杂度O(n+m)

#include <bits/stdc++.h>
using namespace std;
const int N=1010;
int c[N];
void getc(string b){
    int j=0;
    c[j]=0;
    for(int i=1;i<b.length();i++){
        while(b[i]!=b[j]&&j>0){
            j=c[j-1];
        }
        if(b[i]==b[j]){
        	j+=1;
		}
        c[i]=j;
    }
}
int KMP(string a,string b){
	int cnt=0;
	int j=0;
	memset(c,0,sizeof(c));
	getc(b);
	for(int i=0;i<a.length();i++){
		if(a[i]!=b[j]&&j>0){
			j=c[j-1];
		}
		if(a[i]==b[j]){
			j+=1;
		}
		if(j==b.length()){
			j=0;
			cnt++;
		} 
	}
	return cnt;
}
int main(){
    string a,b;
	while(cin>>a)
	{
		if(a=="#") break;
		cin>>b;
		cout<<KMP(a,b)<<endl;
	}
    return 0;
}

L - 最长回文子串

利用动态规划进行查找

空间复杂度O(n),时间复杂度O(n2)

#include <bits/stdc++.h>
using namespace std;
int main(){
	string str;
	cin>>str;
	if (str.size()<2) {
            return str.size();
    }
    else{
    	
		bool dp[str.size()][str.size()];
		int maxlen=1;
		int k=0;
		for(int i=0;i<str.size();i++){
			dp[i][i]=true;	
		}
		for (int j = 1; j < str.size(); j++) {
	            for (int i = 0; i < j; i++) {
	                if (str[i] != str[j]) {
	                    dp[i][j] = false;
	                } 
					else {
	                    if (j - i < 3) {
	                        dp[i][j] = true;
	                    } 
						else {
	                        dp[i][j] = dp[i + 1][j - 1];
	                    }
	                }
	                if (dp[i][j] && j - i + 1 > maxlen) {
	                    maxlen = j - i + 1;
	                    k = i;
	                }
	            }
	    }
	    cout<<maxlen;
	}
	return 0;
}

上一篇:C++prime十万字笔记 第八章 IO类


下一篇:codeforces1620E Replace the Numbers(并查集)