zzuli oj 1163: 亲和串(字符串)

本文介绍了一种通过将一个字符串加倍来实现循环移位的方法,以此判断另一个字符串是否可以通过循环移位得到。此方法适用于字符串匹配场景,尤其当需要判断两个字符串是否可以通过循环移位相等时非常有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a,b;
    while (cin>>a>>b){

         if (a.size() < b.size()) printf("no\n");
         else{
            a=a+a;//保证循环移动的最大化
            if(a.find(b) == -1)     printf("no\n");
            else                    printf("yes\n");
         }
    }
    return 0;
}

### ZZULI OJ 1163: 亲和字符串) #### 解决方案概述 ZZULI OJ 1163涉及判断两个字符串是否为亲和。对于这个问题,核心在于理解如何通过循环移位来验证一个字符串能否成为另一个字符串的一部分。 #### 判断逻辑 当`len1 >= len2`时,在字符串`s1`后面连接一次自身的拷贝形成新的字符串。这一步骤可以通过标准库函数`strcat()`实现[^4]。具体来说: - 如果原始字符串`s1="ABC"`,则处理后的`s1`变为`"ABCABC"`。 这种操作使得原本需要复杂计算的循环移位问题变得简单化,只需检查`s2`是否作为子存在于扩展后的`s1`中即可完成判定工作。 #### C++ 实现代码 下面是基于上述思路的一个可能解决方案: ```cpp #include <iostream> #include <string.h> using namespace std; bool isAffinityString(const char* s1, const char* s2){ int len1 = strlen(s1); int len2 = strlen(s2); if(len1 != len2 || len1 == 0) return false; char temp[2 * len1 + 1]; // 创建临时字符数组存储两倍长度的s1 strcpy(temp, s1); // 将原s1复制到temp中 strcat(temp, s1); // 追加一份完整的s1至temp末端 // 检查s2是否位于拼接后的字符串之中 return strstr(temp, s2) != NULL ? true : false; } int main(){ char str1[100005], str2[100005]; while(cin >> str1 >> str2){ cout << (isAffinityString(str1, str2)? "Yes\n":"No\n"); } } ``` 此程序首先读取一对字符串输入,接着调用辅助函数`isAffinityString`来进行实际比较并输出结果。“Yes”表示两者互为亲和,“No”反之。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值