语法基础(字符串)


作者:进击攻城狮
个人主页:欢迎访问我的主页
首发时间:2022年8月31日星期三
订阅专栏:刷题
个人信条:星光不问赶路人,岁月不负有心人。
如果文章有错误,欢迎在评论区指正。
🎉 支持我:点赞👍+收藏⭐️+留言📝


776. 字符串移位包含问题

对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。

给定两个字符串 s1s1 和 s2s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。

例如 CDAA 是由 AABCD 两次移位后产生的新串 BCDAA 的子串,而 ABCDACBD 则不能通过多次移位来得到其中一个字符串是新串的子串。

输入格式

共一行,包含两个字符串,中间由单个空格隔开。

字符串只包含字母和数字,长度不超过 3030。

输出格式

如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出 true,否则输出 false

输入样例:
AABCD CDAA
输出样例:
true
// #include <iostream>
// #include <algorithm>

// using namespace std;

// int main()
// {
//     string a, b;

//     cin >> a >> b;
//     if (a.size() < b.size()) swap(a, b);

//     for (int i = 0; i < a.size(); i ++ )
//     {
//         a = a.substr(1) + a[0];

//         for (int j = 0; j + b.size() <= a.size(); j ++ )
//         {
//             int k = 0;
//             for (; k < b.size(); k ++ )
//                 if (a[j + k] != b[k])
//                     break;
//             if (k == b.size())
//             {
//                 puts("true");
//                 return 0;
//             }
//         }
//     }

//     puts("false");

//     return 0;
// }

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    string a,b;
    cin>>a>>b;
    if(a.size()<b.size())swap(a,b);
    for(int i=0;i<a.size();i++)
    {
        a=a.substr(1)+a[0];
        for(int j=0;j+b.size()<=a.size();j++)
        {
            int k=0;
            for(;k<b.size();k++)
            
                if(a[j+k]!=b[k])
                break;
                if(k==b.size())
                {
                    puts("true");
                    return 0;
                }
            
        }
            }
            puts("false");
            return 0;
    
}

777. 字符串乘方

给定两个字符串 aa 和 bb,我们定义 a×ba×b 为他们的连接。

例如,如果 a=a=abc 而 b=b=def, 则 a×b=a×b=abcdef

如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a0=a0=``(空字符串),a(n+1)=a×(an)a(n+1)=a×(an)。

输入格式

输入包含多组测试样例,每组测试样例占一行。

每组样例包含一个字符串 ss,ss 的长度不超过 100100。

最后的测试样例后面将是一个点号作为一行。

输出格式

对于每一个 ss,你需要输出最大的 nn,使得存在一个字符串 aa,让 s=ans=an。

输入样例:
abcd
aaaa
ababab
.
输出样例:
1
4
3
#include<bits/stdc++.h>
using namespace std;
int main()
{
    string str;
   
    while(cin>>str,str!=".")
    {
         int len=str.size();
        for(int i=len;i;i--)
        if(len%i==0){
            int m=len/i;
            string r=str.substr(0,m);
            string s;
            for(int j=0;j<i;j++){
                s+=r;
            }
            if(s==str){
            cout<<i<<endl;
           break;
            }
        }
    }

    return 0;
}

778. 字符串最大跨距

有三个字符串 S,S1,S2S,S1,S2,其中,SS 长度不超过 300300,S1S1 和 S2S2 的长度不超过 1010。

现在,我们想要检测 S1S1 和 S2S2 是否同时在 SS 中出现,且 S1S1 位于 S2S2 的左边,并在 SS 中互不交叉(即,S1S1 的右边界点在 S2S2 的左边界点的左侧)。

计算满足上述条件的最大跨距(即,最大间隔距离:最右边的 S2S2 的起始点与最左边的 S1S1 的终止点之间的字符数目)。

如果没有满足条件的 S1S1,S2S2 存在,则输出 −1−1。

例如,S=S= abcd123ab888efghij45ef67kl, S1=S1= ab, S2=S2= ef,其中,S1S1 在 SS 中出现了 22 次,S2S2 也在 SS 中出现了 22 次,最大跨距为:1818。

输入格式

输入共一行,包含三个字符串 S,S1,S2S,S1,S2,字符串之间用逗号隔开。

数据保证三个字符串中不含空格和逗号。

输出格式

输出一个整数,表示最大跨距。

如果没有满足条件的 S1S1 和 S2S2 存在,则输出 −1−1。

输入样例:
abcd123ab888efghij45ef67kl,ab,ef
输出样例:
18
#include<iostream>
using namespace std;
int main()
{
    string s,s1,s2;
    char c;
    while(cin>>c,c!=',')s+=c;
    while(cin>>c,c!=',')s1+=c;
    while(cin>>c)s2+=c;
    if(s.size()<s1.size()||s.size()<s2.size())
    puts("-1");
    else{
        int l=0;
        while(l+s1.size()<=s.size())
        {
            int k=0;
            while(k<s1.size())
            {
                if(s[l+k]!=s1[k])break;
                k++;
            }
            if(k==s1.size())break;
            l++;
        }
        int r=s.size()-s2.size();
        while(r>=0)
        {
            int k=0;
            while(k<s2.size())
            {
                if(s[r+k]!=s2[k])break;
                k++;
            }
            if(k==s2.size())break;
            r--;
        }
        l+=s1.size()-1;
        if(l>=r)puts("-1");
        else printf("%d\n",r-l-1);
        
    }
    return 0;

}

779. 最长公共字符串后缀

给出若干个字符串,输出这些字符串的最长公共后缀。

输入格式

由若干组输入组成。

每组输入的第一行是一个整数 NN。

NN 为 00 时表示输入结束,否则后面会继续有 NN 行输入,每行是一个字符串(字符串内不含空白符)。

每个字符串的长度不超过 200200。

输出格式

共一行,为 NN 个字符串的最长公共后缀(可能为空)。

数据范围

1≤N≤2001≤N≤200

输入样例:
3
baba
aba
cba
2
aa
cc
2
aa
a
0
输出样例:
ba

a
#include<iostream>
using namespace std;
const int N=200;
int n;
string str[N];
int main()
{
    while(cin>>n,n)
    {
        int len=1000;
        for(int i=0;i<n;i++)
        {
            cin>>str[i];
            if(len>str[i].size()) len=str[i].size();
        }
        while(len)
        {
            bool success=true;
            for(int i=1;i<n;i++)
            {
                bool is_same=true;
                for(int j=1;j<=len;j++)
                if(str[0][str[0].size()-j]!=str[i][str[i].size()-j])
                {
                    is_same=false;
                    break;
                }
                if(!is_same)
                {
                    success=false;
                    break;
                }
            }
            if(success)break;
            len--;
        }
        cout<<str[0].substr(str[0].size()-len)<<endl;
        
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值