兩個字串s和t,判斷t是否為s的重新排列後組成的
阿新 • • 發佈:2018-12-16
原始碼在linux裡面編譯測試通過,判斷t字串是否是s字元中的字元重新排序組合的。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #define DEBUG 0 #define true 0 #define false 1 int Deal_String(char *t, char *s) //記憶體統計法,適用於字元多的情況下,字元少也行 { clock_t begin, end; double cost; begin = clock(); char *ss = s, *tt = t; int flag = false; int lengt = strlen(tt); int lengs = strlen(ss); if(lengt != lengs) return false; char *tram = malloc(128 * sizeof(char)); char *sram = malloc(128 * sizeof(char)); memset(tram, 0, (128 * sizeof(char))); memset(sram, 0, (128 * sizeof(char))); for(int i = 0; i < lengt; i++) { tram[*tt]++; sram[*ss]++; #if DEBUG printf("tram[%d]=%d,sram[%d]=%d\n", *tt, tram[*tt], *ss, sram[*ss]); #endif tt++; ss++; } if(memcmp(tram, sram , (128 * sizeof(char)))) flag = false; else flag = true; free(tram); free(sram); end = clock(); cost = (double)(end - begin)/CLOCKS_PER_SEC; printf("Time cost is: %lf secs\n", cost); return flag; } int datcmp(void *a, void *b) { return (*(char *)a > *(char *)b) ? 1 : -1; } int Deal_Str_Sort(char *t, char *s) //排序統計法,適用於字元少的情況,排序直接呼叫C介面 { clock_t begin, end; double cost; begin = clock(); char *ss = s, *tt = t; int flag = false; int lengt = strlen(tt); int lengs = strlen(ss); if(lengt != lengs) return false; char *tram = malloc(lengt * sizeof(char)); char *sram = malloc(lengt * sizeof(char)); memset(tram, 0, (lengt * sizeof(char))); memset(sram, 0, (lengt * sizeof(char))); memcpy(tram, tt, lengt); memcpy(sram, ss, lengt); qsort(tram, lengt, sizeof(char), datcmp); qsort(sram, lengt, sizeof(char), datcmp); #if DEBUG printf("T is:%s S is:%s\n", tram, sram); #endif if(!strncmp(tram, sram, lengt)) flag = true; free(tram); free(sram); end = clock(); cost = (double)(end - begin)/CLOCKS_PER_SEC; printf("Time cost is: %lf secs\n", cost); return flag; } int main(int argc, char **argv) { if(argc != 4) { printf("Param Input Error!\n"); exit(1); } char *t = argv[1], *s = argv[2]; printf("T is %s,S is %s,method is %s\n", t, s, argv[3]); if(!strcmp(argv[3], "memory")) { if(Deal_String(t, s)) printf("Is False\n"); else printf("Is True\n"); return 0; } if(!strcmp(argv[3], "sort")) { if(Deal_Str_Sort(t, s)) printf("Is False\n"); else printf("Is True\n"); return 0; } printf("Method Input Error !\n"); return 1; }
Makefile 檔案
CC=gcc
OBJECTS=strst.o
BIN=test
$(BIN):$(OBJECTS)
$(CC) $^ -o [email protected]
%.o:%.c
$(CC) -c $<
help:
echo "./test heelo oohee"
echo "T is heelo"
echo "S is oohee"
clean:
rm -fr $(OBJECTS)
rm -fr $(BIN)
執行示例:
記憶體統計法:
./test hello olelo memory
T is hello,S is olelo,method is memory
Time cost is: 0.000013 secs
Is False
排序法:
T is hello,S is olelo,method is sort
Time cost is: 0.000039 secs
Is False
有此可見,兩種演算法都很快,對於時間的消耗都很少。