HENAU冬令营 字符串专题

L - 最长回文子串

(中心扩散法)

#include<bits/stdc++.h>
using namespace std;

int check1(string s, int left, int right);
int check2(string s);
 
//
 int main()
 {  
 	string s;
 	cin>>s;
 	cout<<check2(s)<<endl;
 	return 0;
 } 
 
 

 int check2(string s) 
	{
		int start = 0, end = 0;
		for (int i = 0; i < s.length(); i++)
		{
			int len1 = check1(s, i, i);//一个元素为中心
			int len2 = check1(s, i, i + 1);//两个元素为中心
			int len = max(len1, len2);
			if (len > end - start)
			{
				//cout<<len<<endl;
				start = i - (len - 1) / 2;
				end = i + len / 2;
			}
		}
		return (end - start + 1);
	}
///
	int check1(string s, int left, int right)
	{
		int L = left, R = right;
		while (L >= 0 && R < s.length() && s[L] == s[R])
		{// 计算以left和right为中心的回文串长度
			L--;
			R++;
		}
		return R - L - 1;//计算的为该回文字符串的全长度 
	}

K - 剪花布条

#include<bits/stdc++.h>
using namespace std;
int main(){
    string scr,tar;
    int i,j;
    while(1){cin>>scr;
    	if(scr[0]=='#'&&scr.length()==1)
    	break;
    	cin >> tar;
    	int cnt = 0;
        for(i = 0; i < scr.size(); i++){
            int flag = 1;
            for(j = 0; j < tar.size(); j++){
                if(tar[j]!=scr[i+j]){
                    flag = 0;
                    break;
                }
            }
            if(flag){
                cnt++;
                i += tar.size()-1;
            }
        }
        cout << cnt << endl;
	}
    return 0;
}

J - 子串查找

采用kmp算法(BF算法 ddddd

也可用哈希做做

#include <bits/stdc++.h>
using namespace std;
string s,p;
int a[1000010];
void m(string p){
    a[0]=-1;
    int i=0,j=-1,l=p.size();
    while(i<l-1){
            if(j==-1||p[i]==p[j]){
        i++;
        j++;
        a[i]=j;
        }
        else
            j=a[j];
    }
}
int kmp(string s,string p){
    m(p);
    int i=0,j=0,t=0,l1=s.size(),l2=p.size();
    while(i<l1){
        if(j==-1||s[i]==p[j]){
            i++;
            j++;
        }
        else
            j=a[j];
        if(j==l2){
            t++;
            i--;
            j--;
            j=a[j];
        }
 
    }
    return t;
}
int main(){
    cin>>s;
    cin>>p;
    cout<<kmp(s,p)<<endl;
    return 0;
}

I - 验证子串

哈哈哈哈用find偷个懒

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

H - 字典序

string类型的好处就是可以直接比较大小,甚至自由加减(拼接,删除)

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

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

经典问题,先把在左边的压入栈,检测到右边的,再让左边的出栈与其比对。

#include<bits/stdc++.h>
using namespace std;
char a[150];
int main()
{
    while(gets(a))
    {
    	int i,i2=0,flag=0;
    	char stack[150];
    	for(i=0;i<strlen(a);i++)
    	{
    		if(a[i]=='('||a[i]=='{'||a[i]=='[')
    		{
    			stack[i2++]=a[i];
			}
			if(a[i]==')')
			{
				if(stack[--i2]=='(')
				{
					flag=1;
				}else{
					flag=0;break;
				}
			}
			if(a[i]=='}')
			{
				if(stack[--i2]=='{')
				{
					flag=1;
				}else{
					flag=0;break;
				}
			}
			if(a[i]==']')
			{
				if(stack[--i2]=='[')
				{
					flag=1;
				}else{
					flag=0;break;
				}
			}
		}
		if(flag==1&&i2==0)
	{
		cout<<"yes"<<endl;
	}else{
		cout<<"no"<<endl;
	}
	}
    return 0;
}

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

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值