私は文字列の配列を持っていて、すべての文字列(存在する場合)の配列内の最初の擬似文字列を探したいと思います。だから私は最初に配列をソートしてから、逆の単語をバイナリ検索することにしました。だからここまでは私が今まで持っているものです:配列内の最初のpseudopalindromeを見つけよう
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char len(char *x){
char len = 0;
while (*x != '\0'){
x++;
len++;
}
return len;
}
char compare(char *x, char *y){
char x0 = &x;
char y0 = &y;
while (*x != '\0'){
if (tolower(*x) < tolower(*y)) return -1;
if (tolower(*x) > tolower(*y)) return 1;
x++;
y++;
}
// if we are here it means that strings are equal (case insensitive)
x = &x0;
y = &y0;
while (*x != '\0'){
if (*x > *y) return -1;
if (*x < *y) return 1;
x++;
y++;
}
// strings are equal (case sensitive)
return 0;
}
char *reverse(char *x){
int i, j;
char temp, *rev = NULL;
rev = malloc(sizeof(char)*(len(x)+1));
rev = strcpy(rev,x);
i = 0;
j = len(x) - 1;
while (i < j){
temp = rev[i];
rev[i] = x[j];
rev[j] = temp;
i++;
j--;
}
return rev;
}
int binsearch(char *x, char *A, int len){
int l, r, m, index;
l = 0;
r = len - 1;
index = -1;
while (l <= r){
m = (l + r)/2;
if (compare(x, A[m]) == 0){
index = m;
r = m - 1;
}
else if (compare(x, A[m]) == -1) r = m - 1;
else l = m + 1;
}
return index;
}
int main()
{
int n, i, j, k, fnd;
char T[10000][101], temp[101];
scanf("%d", &n);
for (i = 0; i < n; i++){
scanf("%s", &T[i]);
}
for (i = 1; i < n; i++){
strcpy(temp, T[i]);
j = i - 1;
while (j >= 0 && compare(T[j], temp) == 1){
strcpy(T[j+1], T[j]);
j--;
}
strcpy(T[j+1], temp);
}
for (i = 0; i < n; i++){
fnd = binsearch(reverse(T[i]), T, n);
printf("%d", fnd);
}
return 0;
}
このプログラムは実行を停止します。この問題はおそらく、すべての関数がうまく実行されるため、バイナリ検索で起こります。しかし、このバイナリ検索で何が問題になっていますか?それ以外に何がコードを破ることができますか?
字体を修正してください。 –
は、それ自体の逆である文字列です。お互いに逆転している2つの異なる文字列は回文ではありません。専門用語をまっすぐにしてください。 –
'len'関数を書く必要はありません。 Cには 'strlen'という組み込み関数があり、これはあなたが書いたものとまったく同じです。 – selbie