【2022寒假训练营】字符串题解

A - 雷同检测

#include <bits/stdc++.h>
using namespace std;
char a[210],b[210];
int main(){
	gets(a);
	gets(b);
	int lena=strlen(a);
	int lenb=strlen(b);
	int min=lena<lenb?lena:lenb;
	for(int i=0;i<min;i++){
		if(a[i]==b[i])
			cout<<i+1<<" ";
	}
	cout<<'\n';
	return 0;
}

B - 首字母大写

#include <bits/stdc++.h>
using namespace std;
char a[100];
int main(){
	gets(a);
	int len=strlen(a);
	if(a[0]>='a')	
		a[0]-=32;
	for(int i=1;i<len;i++){
		if(a[i-1]==' '||a[i-1]=='\n'||a[i-1]=='\t'||a[i-1]=='\r'){
			if(a[i]>='a')
				a[i]-=32;
		}
			
	}
	puts(a);
	return 0;
}

C - 大小写转换

#include <bits/stdc++.h>
using namespace std;
char a[100];
int main(){
	while(scanf("%s",a)==1){
		int len=strlen(a);
		for(int i=0;i<len;i++){
			if(a[i]>='a')
				a[i]-=32;
		}
		puts(a);
	}
	
	return 0;
}

D - 数字反转

#include <bits/stdc++.h>
using namespace std;
char a[15],b[15];
int main(){
	gets(a);
	int len;
	if(a[0]=='-'){
		cout<<'-';
		len=strlen(a);
		int flag=len-1;
		for(int i=flag;i>=1;i--){
			if(a[i]!='0'){
				flag=i;
				break;
			}
		}
		for(int i=flag;i>=1;i--)
			cout<<a[i];
	}
	else{
		len=strlen(a);
		int flag=len-1;
		for(int i=len-1;i>=0;i--){
			if(a[i]!='0'){
				flag=i;
				break;
			}
		}
		for(int i=flag;i>=0;i--)
			cout<<a[i];
	}
	cout<<'\n';
	return 0;
}

E - 删除单词后缀

#include <bits/stdc++.h>
using namespace std;
char a[40];
int main(){
	gets(a);
	int len=strlen(a),flag=0;
	if(a[len-1]=='r'&&a[len-2]=='e')
		flag=2;
	else if(a[len-1]=='y'&&a[len-2]=='l')
		flag=2;
	else if(a[len-1]=='g'&&a[len-2]=='n'&&a[len-3]=='i')
		flag=3;
	for(int i=0;i<=len-1-flag;i++)
		cout<<a[i];
	cout<<'\n';
	return 0;
}

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

#include <bits/stdc++.h>
using namespace std;
char a[110];
int main(){
	gets(a);
	int len=strlen(a),flag=1;
	for(int i=0;i<=len/2;i++){
		if(a[i]!=a[len-1-i]){
			flag=0;
			break;
		}
	}
	if(flag)
		cout<<"yes";
	else
		cout<<"no";
	cout<<'\n';
	return 0;
}

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

#include<bits/stdc++.h>
using namespace std;
int main()
{
	char s1[101];
	char s2[101];
	while (gets(s1))
	{
		int zk = 0;
		int flag = 0;
		for (int i = 0; i < strlen(s1); i++)
		{
			if (s1[i] == '(' || s1[i] == '[' || s1[i] == '{')
			{
				s2[zk++] = s1[i];
			}
			else if (s1[i] == ')')                   // 遍历到 ) 时
			{
				zk--;
				if (zk < 0 || s2[zk] != '(')        //栈内元素没了 或者 栈顶不是(
				{
					flag = 1;
					break;
				}
			}
			else if (s1[i] == ']')
			{
				zk--;
				if (zk < 0 || s2[zk] != '[')
				{
					flag = 1;
					break;
				}
			}
			else if (s1[i] == '}')
			{
				zk--;
				if (zk < 0 || s2[zk] != '{')
				{
					flag = 1;
					break;
				}
			}
		}
		if (flag == 1 || zk != 0)cout << "no" << endl;    //栈内还有元素 或者 匹配不成功
		else cout << "yes" << endl;
	}
	return 0;
}

H - 字典序

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

I - 验证子串

#include <bits/stdc++.h>
using namespace std;
int main(){
	string a,b;
	cin>>a;
	cin>>b;
	int flag1=0,flag2=0;
	flag1=b.find(a); 
	flag2=a.find(b); 
	if(flag1>0)
		cout<<a<<" is substring of "<<b;
	else if(flag2>0)
		cout<<b<<" is substring of "<<a;
	else
		cout<<"No substring";
	cout<<"\n";
	return 0;
}

J - 子串查找

#include <bits/stdc++.h>
using namespace std;
int ne[1000100],len1,len2;
char a[1000100],b[1000100];
void get_next()
{
    int  j=-1,i=0;
    ne[0]=-1;
   while(i<len2)
   {
        if(j==-1||b[i]==b[j])
        {
            i++;         //i仍然是0
            j++;         //j仍然是-1
            ne[i]=j;     //在这个里面 i已经变成1 ,j已经变成·0   ,这与ne[i++]=j++ 不一样
        }
         else
        j=ne[j];
   }
}
void kmp()
{
    int  j=0,i=0;
     int ans=0;
     // get_next();
     while(i<len1)
     {
         if(j==-1||a[i]==b[j])
         {
             ++i;
             ++j;
         }
         else
            j=ne[j];
         if(j==len2)
         {

             j=ne[j];    //题目说可以叠加  ,如果不能叠加 j=0 
               ans++;
         }
     }
     printf("%d\n",ans);
}
int main()
{
    scanf("%s %s",a,b);
    len1=strlen(a);    //主
    len2=strlen(b);     //子
    if(len2>len1)
        printf("0\n");
     get_next();
     kmp();
    return 0;
}

K - 剪花布条

#include <bits/stdc++.h>
using namespace std;
int ne[1010],len1,len2;
char a[1010],b[1010];
void get_next()
{
    int  j=-1,i=0;
    ne[0]=-1;
   while(i<len2)
   {
        if(j==-1||b[i]==b[j])
        {
            i++;         
            j++;         
            ne[i]=j;     
        }
         else
        j=ne[j];
   }
}
void kmp()
{
    int  j=0,i=0;
     int ans=0;
     while(i<len1)
     {
         if(j==-1||a[i]==b[j])
         {
             ++i;
             ++j;
         }
         else
            j=ne[j];
         if(j==len2)
         {

             j=0;     
               ans++;
         }
     }
     printf("%d\n",ans);
}
int main()
{
    while (scanf("%s",a)!=EOF){
    	if (a[0] == '#'&&strlen(a) == 1)break;
    	scanf("%s",b);
    	len1=strlen(a);    
   	    len2=strlen(b);     
    	if(len2>len1)
        	printf("0\n");
     	get_next();
     	kmp();
    }
    return 0;
}

L - 最长回文子串

#include<bits/stdc++.h>
using namespace std;
char s[1010];
int dp[1010][1010];
int main()
{
	scanf("%s",s);;
	int len = strlen(s),ans=1;
	for (int i = 0; i < len; i++)
	{
		dp[i][i] = 1;
		if (i < len - 1)
		{
			if (s[i] == s[i + 1])
			{
				dp[i][i + 1] = 1;
				ans = 2;
			}
		}
	}
	for (int j = 3; j <= len; j++)
	{
		for (int i = 0; i + j - 1 < len; i++)
		{
			int l = i + j - 1;
			if (s[i] == s[l] && dp[i + 1][l - 1] == 1)
			{
				dp[i][l] = 1;
				ans = j;
			}
		}
	}
	cout << ans <<"\n";
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值