2025年字符串部分的典型例题(难)

字符串部分的典型例题(难)acwing776 题 字符串移位包含问题 对于一个字符串来说 定义一次循环移位操作为 将字符串的第一个字符移动到末尾形成新的字符串 给定两个字符串 s1 和 s2 要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串 例如 CDAA 是由 AABCD 两次移位后产生的新串 BCDAA 的子串

大家好,我是讯享网,很高兴认识大家。

acwing776题:字符串移位包含问题

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

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

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

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

输入样例:
AABCD CDAA
输出样例:
true

#include <bits/stdc++.h> using namespace std; int main(void) { 
    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()) { 
    printf("true\n"); return 0; } } } printf("false\n"); return 0; } 

讯享网

acwing777题:字符串乘方

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

例如,如果a=”abc” 而b=”def”, 则a*b=”abcdef”。

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

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

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

输入样例:
abcd
aaaa
ababab
.

输出样例:
1
4
3

讯享网#include <bits/stdc++.h> using namespace std; int main(void) { 
    string str; while(cin>>str&&str!=".") { 
    int len=str.size(); for(int n=len;n;n--) { 
    if(len%n==0) { 
    int m=len/n; string s=str.substr(0,m); string l; for(int i=0;i<n;i++) l+=s; if(l==str) { 
    cout<<n<<endl; break; } } } } return 0; } 

acwing778题:字符串最大跨距

有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10。

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


讯享网

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

如果没有满足条件的S1,S2存在,则输出-1。

例如,S = “abcd123ab888efghij45ef67kl”, S1=”ab”, S2=”ef”,其中,S1在S中出现了2次,S2也在S中出现了2次,最大跨距为:18。

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

如果没有满足条件的S1和S2存在,则输出-1.

输入样例:
abcd123ab888efghij45ef67kl,ab,ef
输出样例:
18

#include <bits/stdc++.h> 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; for(l=0;l + s1.size() <= s.size();l++) { 
    int k = 0; while (k < s1.size()) { 
    if (s[l + k] != s1[k]) break; k ++ ; } if (k == s1.size()) break; } int r; for(r = s.size() - s2.size();r >= 0;r--) { 
    int k = 0; while (k < s2.size()) { 
    if (s[r + k] != s2[k]) break; k ++ ; } if (k == s2.size()) break; } l += s1.size() - 1; if (l >= r) puts("-1"); else printf("%d\n", r - l - 1); } return 0; } 

acwing779题:最长公共字符串后缀

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

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

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

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

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

a

讯享网#include <bits/stdc++.h> using namespace std; int n; string str[200]; int main(void) { 
    while(cin>>n&&n) { 
    int len=1000; for(int i=0;i<n;i++) { 
    cin>>str[i]; if(str[i].size()<len) 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; } } 

如有问题,欢迎在评论区提问

小讯
上一篇 2025-01-14 15:47
下一篇 2025-01-18 23:32

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/67911.html