输入:
L:“hello”“july”
S:“hellomehellojuly”
输出:S中包含的L一个单词,要求这个单词只出现一次,如果有多个出现一次的,输出第一个这样的单词。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10000
char content[SIZE], *pstr[SIZE];
int pstrcmp(char* p, char* q) {
return strcmp(*(char* const *) p, *(char* const *) q);
}
int getCommonLen(char* p, char* q) {
int len = 0;
while (*p && *(p++) == *(q++)) {
len++;
}
return len;
}
/*
*截取字符串
*/
char* subString(char *src, int pos, int len) {
char *p = src;
char *substr = (char*) calloc(sizeof(char), len + 1);
int i = 0;
p += pos;
while (len--) {
substr[i++] = *(p++);
}
substr[i] = '\0';
return substr;
}
int getIndexs(char *content, char* search) {
int i = 0;
int rear = 0, front = 0;
int contentSize = strlen(content);
i = 0;
int difLen = strlen(search);
front = 0;
rear = front + difLen - 1;
while (rear <= contentSize) {
if (!strcmp(search, subString(content, front, difLen))) {
return front;
}
front++;
rear++;
}
return contentSize;
}
int main(void) {
char* search[] = { "hello", "july", "me", "hellom" };
char* src = "hellomehellojuly";
int len = strlen(src);
int i;
for (i = 0; i < len; ++i) {
pstr[i] = &content[i];
content[i] = *(src + i);
}
content[i] = '\0';
int searchSize = sizeof(search) / sizeof(char*);
int j;
qsort(pstr, len, sizeof(char*), pstrcmp);
int* count = calloc(sizeof(int), searchSize);
//统计每个关键字出现的次数
for (j = 0; j < searchSize; j++) {
int curLen = strlen(search[j]);
int isOver = 0;
for (i = 0; i < len; i++) {
if (getCommonLen(search[j], pstr[i]) == curLen) {
count[j]++;
isOver = 1;
continue;
}
//超过单词所在域,直接进入跳过后面的比较
if (isOver) {
break;
}
}
}
int index = len;
int id = 0;
int contentId;
for (i = 0; i < searchSize; i++) {
//查找出现次数为1且下标最小的
if (count[i] == 1) {
if (index > (contentId = getIndexs(content, search[i]))) {
index = contentId;
id = i;
}
}
}
puts(search[id]);
return EXIT_SUCCESS;
}