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;
}