Вы упоминаете в комментариях, что это правильно, но очень медленно.
В Java вы можете получить длину String
с помощью s.length()
- это значение кэшируется в объекте иO(1)
, чтобы получить.
Но когда вы переходите к C, вы получаете длину строки с strlen(s)
, которая каждый раз пересчитывает (в O(n)
).Поэтому, пока вы должны выполнять O(n)
, потому что там есть операция O(n)
, вся функция становится O(n^2)
.
Чтобы обойти это, кэшируйте значение один раз при запуске.Это вернет вас к линейному времени.
Плохо:
scanf("%s",s);
for(i=0;i<strlen(s);i++)
if(s[i]==s[0])
{
sum=sum+getSim(s,i);
}
Хорошо:
scanf("%s",s);
strlen = strlen(s); /* assume you declared "int strlen" earlier */
for(i=0;i<strlen;i++) /* this is now constant time to run */
if(s[i]==s[0])
{
sum=sum+getSim(s,i);
}