-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathstring_search.c
126 lines (113 loc) · 3.09 KB
/
string_search.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/**
* Copyright © https://github.com/jarry All rights reserved.
* @author: jarryli@gmail.com
* @version: 1.0
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <memory.h>
int find(char* str, char* text)
{
int text_len = strlen(text);
int str_len = strlen(str);
// 两个循环,外层是被查找文本,内循环是查找字符串
for (int i = 0; i < text_len; i++)
{
int j = 0;
for (; j < str_len; j++)
{
// 当遇到不有不相等时,跳出从文本下一个字符开始比较
if (str[j] != text[i + j])
{
break;
}
}
// 如果查找字符串全部比较完成表示成功匹配
if (j == str_len)
{
return i;
}
}
// 如果文本全部比较完还是没有查找到,则返回-1
return -1;
}
int find2(char* str, char* text)
{
int text_len = strlen(text);
int str_len = strlen(str);
// 两个循环,外层是被查找文本,内循环是查找字符串
for (int i = 0, l = text_len - str_len + 1; i < l; i++)
{
int j = 0;
for (; j < str_len; j++)
{
// 循环长度优化+剩余字符优化
// 如果被查找的长度比要查找的还少,则可以返回-1
if (text_len - i < str_len - j)
{
// console.log('less length', i, j)
return -1;
}
// 当遇到不有不相等时,跳出从文本下一个字符开始比较
if (str[j] != text[i + j])
{
break;
}
}
// 如果查找字符串全部比较完成表示成功匹配
if (j == str_len)
{
return i;
}
}
// 如果文本全部比较完还是没有查找到,则返回-1
return -1;
}
int main()
{
/* find test */
float startTime = clock();
printf("find start");
char str1[] = "ABC";
char text1[] = "AABABC";
int result = find(str1, text1); // 3
printf("\nfind('ABC', 'AABABC'), %d", result);
char str2[] = "AAB";
char text2[] = "AAAABC";
result = find(str2, text2);; // 2
printf("\nfind('AAB', 'AAAABC'), %d", result);
char str3[] = "ABC";
char text3[] = "AABAC";
result = find(str3, text3);; // -1
printf("\nfind('ABC', 'AABAC'), %d", result);
printf("\ntime: %f ms.", ((clock() - startTime) / CLOCKS_PER_SEC * 1000));
printf("\nfind end\n");
/* find2 test */
startTime = clock();
printf("find2 start");
result = find2(str1, text1); // 3
printf("\nfind('ABC', 'AABABC'), %d", result);
result = find2(str2, text2);; // 2
printf("\nfind('AAB', 'AAAABC'), %d", result);
result = find2(str3, text3);; // -1
printf("\nfind('ABC', 'AABAC'), %d", result);
printf("\ntime: %f ms.", ((clock() - startTime) / CLOCKS_PER_SEC * 1000));
printf("\nfind2 end\n");
}
/**
jarry@jarrys-MacBook-Pro nativesearch % gcc string_search.c -o string_search
jarry@jarrys-MacBook-Pro nativesearch % ./string_search
find start
find('ABC', 'AABABC'), 3
find('AAB', 'AAAABC'), 2
find('ABC', 'AABAC'), -1
time: 0.041000 ms.
find end
find2 start
find('ABC', 'AABABC'), 3
find('AAB', 'AAAABC'), 2
find('ABC', 'AABAC'), -1
time: 0.006000 ms.
find2 end
*/