C語言編程 字符串的旋轉(左旋右旋及判斷)
阿新 • • 發佈:2019-04-28
ret 規律 首字符 stdlib.h 過程 \n 題目 main 元素 此前不太熟悉這種類型的題目,特此做一個合計的方法總結。
包括字符串中字符的左旋(右旋),和判斷一個字符串是否是由另一個字符串旋轉(左旋或者右旋)而來。
包括字符串中字符的左旋(右旋),和判斷一個字符串是否是由另一個字符串旋轉(左旋或者右旋)而來。
一.字符串的左旋(右旋)
由於左旋和右旋思路一致,這裏僅介紹左旋方法。
這種題目有兩種思路:
1.首字符的後置以及其余元素的往前推置,循環重復此過程K次(k為左旋字符個數)。
eg:
字符串為“ABCDEF\0”,要旋轉2個字符,
首先保存首字符到一個變量,然後把其余變量全部提前一位置放,即為“BCDEF \0”(此處註意,最後的終止符\0不要提前,留出一個空位)
再把用來保存的變量給字符串最後一個位置(除\0外),即為“BCDEFA\0”
再做一次此過程即為“CDEFGA \0”——》“CDEFGAB\0”
源代碼:
#include<stdio.h> #include<stdlib.h> #include<string.h> void Exchange(char *str, int k) { int i,m; char temp; char *sta; for (i = 0; i < k; i++) { sta = str; temp = *str;//保存首字符 for (m = 0; m <= (int)strlen(str)-1; m++)//元素提前放置 { *sta = *(sta + 1); sta++; } *(str+strlen(str)) = temp;//將首字符放置最後 } } int main() { int leng; printf("請輸入要左旋幾個字符\n"); scanf("%d", &leng); char str[] = "ABCDEFG"; Exchange(str,leng); printf("%s\n", str); system("pause"); return 0; }
2.三步旋轉法
這種方法是由觀察得來,旋轉後的字符串有此規律:
旋轉前“ABCDEFG”
旋轉後“CDEFGAB”
將旋轉後的字符逆置得
“CDEFGBA”
將未旋轉的字符逆置得
“GFEDCBA”
再將全部字符逆置就得到了原來的字符串“ABCDEFG”
原字符串旋轉時反向操作即可
源代碼:
#include<stdio.h> #include<stdlib.h> #include<string.h> void reverse(char *left, char *right)//逆置函數 { char temp; while (left < right) { temp = *left; *left = *right; *right = temp; left++; right--; } } void Exchange(char *str, int leng)//三步逆置 { reverse(str, str + leng-1); reverse(str + leng, str+strlen(str)-1); reverse(str, str + strlen(str) - 1); } int main() { int leng; printf("請輸入要左旋幾個字符\n"); scanf("%d", &leng); char str[] = "ABCDEFG"; Exchange(str,leng); printf("%s\n", str); system("pause"); return 0; }
二.判斷一個字符串是否是由另一個字符串旋轉而來
1.第一種思路是不借助字符串庫函數,將需要判斷的字符串按照三步逆置法判斷是否和原字符串相同,但是這種方法效率較差,而且時間復雜度高。
源代碼:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void reverse(char *left,char *right)
{
char temp;
while (left < right)
{
temp = *left;
*left = *right;
*right = temp;
left++; right--;
}
}
int judgeStr(char str1[],char str2[],char str3[])
{
int i,m=0,sum=0,s;
char *sta ;
char *fina ;
int length = strlen(str1);
for (i = 0; i <(int)strlen(str2); i++)
{
str3[i] = str2[i];
}
for (i = 0; i <= (int)strlen(str1) - 1; i++)
{
sta = str3;
fina = str3 + strlen(str1) - 1;
reverse(sta, sta + i);
reverse(sta + i + 1, fina);
reverse(sta, fina);
for (; m < (int)strlen(str1); m++)
{
if (str1[m] != str3[m])
{
sum++;
break;
}
}
for (s = 0; s<(int)strlen(str2); s++)
{
str3[s] = str2[s];
}
if (sum == 4)
{
return 0;
}
}
return 1;
}
int main(void)
{
char str1[] = "ABCDE";
char str2[] = "BCDEA";
char str3[] = "BACDE";
char stra[] = "AAAAA";
int judge;
judge = judgeStr(str1, str2,stra);
if (judge == 1)
{
printf("str2是由str1旋轉得來的\n");
}
else
{
printf("str2不是由str1旋轉得來的\n");
}
judge = judgeStr(str1, str3,stra);
if (judge == 1)
{
printf("str3是由str1旋轉得來的\n");
}
else
{
printf("str3不是由str1旋轉得來的\n");
}
system("pause");
return 0;
}
2.使用字符串庫函數解決
使用此方法需要註意到一個規律:
一個字符串後面再接一個和自身相同的字符串後,此字符串中就出現了所有旋轉可以得到的結果。
eg:
A B C D A B C D,其中有所有的“ABCD”旋轉結果,BCDA(2~5),CDAB(3~6),DABC(4~7)。
所以做法就是利用庫函數將原字符串拼接一個自身,再在字符串中查找需要判斷的字符串即可。
源代碼:
#include<stdio.h>
#include<string.h>
int judge(char *str1, char *str2)
{
strncat(str1, str1, strlen(str1));//原字符串拼接本身
char *result = strstr(str3, str2);//查找目標字符串
if (result == NULL)
{
return -1;
}
else
{
return 0;
}
}
int main()
{
char str1[] = "ABCDE";
char str2[] = "CDEAB";
char str3[] = "DEBAC";
int result = judge(str1, str2);
if (result == -1)
{
printf("str2不是由str1旋轉得到\n");
}
else
{
printf("str2是由str1旋轉得到\n");
}
result = judge(str1, str3);
if (result == -1)
{
printf("str3不是由str1旋轉得到\n");
}
else
{
printf("str3是由str1旋轉得到\n");
}
system("pause");
return 0;
}
C語言編程 字符串的旋轉(左旋右旋及判斷)