POJ字符串移位包含问题(详细思路)

版权声明:@ly https://blog.csdn.net/lytwy123/article/details/83552150

1.问题描述:


2.算法分析:


这道题目是一道比较巧的题目,如果不能找出规律,大多数人都是一个一个循环移位到后面去。
其实可以用在这个方法:
拿样例举例子:
AABCD我们判断CDAA是不是移位后的子串
一次移位:ABCDA
二次移位:BCDAA
三次移位:CDAAB
四次移位:DAABC
五次移位:AABCD
可以发现经过字符串1的长度次移位(这里是五次移位),又回到了原始串。那么其实字符串1的长度是多少就移动多少次。那么我们如果将原字符串与源字符串拼接是不是就相当于移动五次,然后在拿字符串二与拼接的字符串判断是否为子串。
ABCD ACBD举例:
第一次:BCDA
第二次:CDAB
第三次:DABC
第四次:ABCD
假设拼接字符串ABCDABCD你们看是不是包含了移位的所有情况然后我们在判断是否为子串。
因为题目要求是判断输入的第一个字符串和另一个字符串是否为子串,我们还需要考虑当第一个输入的子串没有第二个输入的子串长时,做一个字符串的交换即可。就比如说:
CDAA ABCDA
这样子的结果也是真。
所以要进行一个输入字符串长度判断。
判断子串需要用到字符串的一个函数strstr


3.源代码:


#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

char str1[100];
char str2[100];
char x[100];
char t[100];

int main()
{
    scanf("%s%s",&str1,&str2);
    if(strlen(str1)<strlen(str2))  //将输入的字符串str1与str2交换 
    {
        strcpy(t,str1);
        strcpy(str1,str2);
        strcpy(str2,t);
    }
    strcpy(x,str1);
/*    for(int i = 0;i<strlen(x);i++)
    cout<<x[i];
    cout<<endl;
    for(int i = 0;i<strlen(str1);i++)
    cout<<str1[i];
    cout<<endl;*/
    if(strstr(strcat(str1,x),str2) == NULL)  //判断是否为子串 
    cout<<"false"<<endl;
    else
    cout<<"true"<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lytwy123/article/details/83552150