文字列内の回文数を見つけるために書いたこのコードの空間と時間の複雑さを見つけるのに苦労しています。
/**
This program finds palindromes in a string.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int checkPalin(char *str, int len)
{
int result = 0, loop;
for ( loop = 0; loop < len/2; loop++)
{
if ( *(str+loop) == *(str+((len - 1) - loop)) )
result = 1;
else {
result = 0;
break;
}
}
return result;
}
int main()
{
char *string = "baaab4";
char *a, *palin;
int len = strlen(string), index = 0, fwd=0, count=0, LEN;
LEN = len;
while(fwd < (LEN-1))
{
a = string+fwd;
palin = (char*)malloc((len+1)*sizeof(char));
while(index<len)
{
sprintf(palin+index, "%c",*a);
index++;
a++;
if ( index > 1 ) {
*(palin+index) = '\0';
count+=checkPalin(palin, index);
}
}
free(palin);
index = 0;
fwd++;
len--;
}
printf("Palindromes: %d\n", count);
return 0;
}
私はそれを試してみましたが、これは私が思うことです:
主に 2 つの while ループがあります。外側のものは、文字列の長さ 1 の全長にわたって実行されます。ここに混乱があります。内側の while ループは最初に全長にわたって実行され、次に n-1、次に n-2 など、外側の while ループの反復ごとに実行されます。ということは、私たちの時間計算量は になるということO(n(n-1)) = O(n^2-n) = O(n^2)
ですか? そして、スペースの複雑さのために、最初に文字列の長さ+1、次に(長さ+1)-1、(長さ+1)-2などにスペースを割り当てます。checkPalin 関数の場合、O(n/2)
.
私は面接の準備をしていて、この概念を理解したいと思っています。
ありがとうございました