最近面试一个开发岗位,遇到一道算法题,现场我只给出了思路,没能在规定时间里写出代码也就没法现场验证,在这里复盘一下。
题目
只能回忆起部分内容,大致是,从一个给定的字符串中找出最长的重复的子串。
分析
假定输入字符串是 asdfddfbiibhddf234
,长度为 18 个字符。
- 子串:长度至少要为 1 个字符,最大 17 个字符。
- 重复子串:当确定以一个子串,如以
asd
为目标寻找重复子串,那么寻找的范围必须是输入字符串中 a
字符之后的部分。
- 需要遍历所有情况。
基于以上 3 条规则,我们可以得出如下思路:
- 利用双重循环遍历所有可能出现的子串。
- 使用
strstr
从输入字符串的子串首字母之后的部分中寻找是否有重复子串。
- 更新最长子串记录。
代码
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
| #include <stdio.h> #include <stdlib.h> #include <string.h>
int substring(char *input, char **output) { int i, j, n; int in_len = strlen(input); int max = 0;
char *tmp; tmp = malloc(in_len);
for (i = 0; i < in_len; i++) { for (j = i + 1; j < in_len; j++) { n = j - i; strncpy(tmp, input + i, n); tmp[n] = '\0'; if (strstr(input + i + 1, tmp)) { if (n > max) { *output = input + i; max = n; } } } }
free(tmp);
return max; }
int main(int argc, char *argv[]) { char *out; int len; int i;
printf(" input: \"%s\"\n", argv[1]);
len = substring(argv[1], &out);
printf("output: \""); for (i = 0; i < len; i++) printf("%c", out[i]); printf("\"\n");
return 0; }
|
测试结果
测试字符串:asdfddfbiibhddf234
结果输出:
1 2
| input: "asdfddfbiibhddf234" output: "ddf"
|
测试字符串:aaa
结果输出:
1 2
| input: "aaa" output: "aa"
|
测试字符串:bbbb
结果输出:
1 2
| input: "bbbb" output: "bbb"
|
测试字符串:c
结果输出: