題意:n個數字組成的排列,問它們能不能通過循環移位形成1 2 3...n的序列或者是n...3 2 1 的序列。
比如2 3 4 5 1 和3 2 1 4 就可以,但是1 2 3 5 4 就不行。題的鏈接
對於這種問題可以兩個for循環從前往後,再從後往前,直接暴力找,找到了一個就行,沒有就不行。但是這樣要考慮很多東西。
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<vector>
#include<climits>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cfloat>
using namespace std;
int main()
{
int T,i,j,a[205],flag,k,t,n,temp;
scanf("%d",&T);
while(T--)
{
flag=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
i=1;
while(i<=n)
{
j=i;
for(k=1;k<n;k++)
{
if(j==n)t=1;
else t=j+1;
if(a[t]!=(a[j]+1))
{
// cout<<t<<" "<<j<<endl;
break;
}
if(j==n)j=1;
else j++;
}
if(k==n)
{
flag=1;
break;
}
j=i;
for(k=1;k<n;k++)
{
if(j==1)t=n;
else t=j-1;
if(a[t]!=(a[j]+1))
break;
if(j==1)j=n;
else j--;
}
if(k==n)
{
flag=1;
break;
}
i++;
}
if(flag)cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
可以直接將序列複製兩遍或者一遍,成爲一個新的序列。然後在這個新的序列裏,找是否出現過1...n或者n...1的序列。
字符串的題也是一樣
如果要判斷一個字符通過循環移位是不是包含了另一個子串,就把它複製兩遍,然後寫個KMP