タイトル:
- 2つの文字列が回転する単語かどうかを判別
説明:
文字列strの場合、文字列strの任意の部分を後ろに移動して、str回転文字列と呼ばれる新しい文字列を形成します。str = "1234"の場合、回転文字列は "2341"、 "3412"、 "4123"です。次に、2つの文字列str1とstr2が与えられたら、2つの文字列が相互に回転した文字列であるかどうかを判断します。
要件:
2つの文字列の長さが互いに異なる場合、2つの文字列は回転された文字列ではありません。2つの文字列の長さが同じである場合、nの場合、アルゴリズムの時間の複雑さはO(n)です。
アイデア:
- 2つの文字列の長さが同じでない場合は、直接falseを返します。
- 長さが同じ場合は、1つの文字列のみを連結する必要があります。次に、新しい大きな文字列に別の文字列が含まれているかどうかが判断されます。含まれている場合、2つは回転する単語です。それ以外の場合は、回転する単語ではありません。
- たとえば、str1 =“ 123”、str2 =“ 234”、接続するstr1文字列を選択し、新しい文字列str_new =“ 123123”を生成して、str_newにstr2が含まれているかどうかを判断します。
コードの実装
関数の実装では複数のライブラリ関数を使用しますが、これは通常、インタビュープロセス中には許可されていません。
- 文字列の連結
- 大きな文字列から小さな文字列を検索します。これは、KMPアルゴリズムを使用して実現できます。
int isRotation(const char *str1, const char *str2)
{
char *str_new = NULL;
int ret = 0, len = 0;
if(!str1 || !str2 || strlen(str1)!=strlen(str2)){
return FALSE;
}
len = strlen(str1)*2;
str_new = (char *)malloc(len); /*无法确定字符串的长度*/
if(!str_new){
printf("malloc error\n");
return FALSE;
}
memset(str_new, 0 ,len);
sprintf(str_new, "%s%s", str1, str1);
if(strstr(str_new, str2)){
ret = TRUE;
}else{
ret = FALSE;
}
free(str_new);
return ret;
/* 使用KMP算法进行字符串的找到
ret = kmpindex(str_new, str2, 0);
if(ret>0){
return TRUE;
}else{
return FALSE;
}
*/
}