旋轉字符串
-
問題描述
S[0…n-1]是一個長度爲n的字符串,定義旋轉函數Left(S) = S[1…n-1] + S[0]。比如S=“abcd”,Left(S)=“bcda”。一個串是對串當且僅當這個串長度爲偶數,前半段和後半段一樣。比如“abcabc”是對串,“aabbcc”則不是。
現在問題是給定一個字符串,判斷他是否可以由一個對串旋轉任意次得到。 -
輸入
第1行:給出一個字符串(字符串非空串,只包含小寫字母,長度不超過1000000) -
輸出
對於每個測試用例,輸出結果佔一行,如果能,輸出YES,否則輸出NO。 -
樣例輸入
abcabc
abccba -
樣例輸出
YES
NO -
思路解析
通過gets()函數讀取數據到數組中(注:getchar()函數每次讀一個字符,gets()函數則每次讀一整行)。
用strlen()函數獲取數組長度,字符串無論如何旋轉,初始非對串永遠都不會是對串,反之亦然,且對串中任一字符有且僅有一個字符與之對應。
因此通過數組長度進行前後比較,設置兩個變量,從字符串開始與中間部位依次進行比較,每組字符都完全相等,纔可能是對串。
該題中已註明只有偶數串纔可能爲對串,因此奇數串不予考慮。 -
C語言實現如下
#include<stdio.h>
#include<string.h>
int main(){
char a[1000001];
gets(a);
int flag = 0;
for(int i=0,j=strlen(a)/2;j<strlen(a);i++,j++){
if(a[i]!=a[j]){
flag =1;
break;
}
}
if(!flag){
printf("YES\n");
}else{
printf("NO\n");
}
return 0;
}