字符串的包含

来源:互联网 发布:信托公司硕士待遇 知乎 编辑:程序博客网 时间:2024/06/01 10:46

输入:

L:“hello”“july”

S:“hellomehellojuly”

输出:S中包含的L一个单词,要求这个单词只出现一次,如果有多个出现一次的,输出第一个这样的单词。

#include <stdio.h>#include <stdlib.h>#define SIZE 10000char 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;}


0 0
原创粉丝点击