如何比较最大长度为100的2个字符串并打印相同的部分,如:
STRING 1 : ABCDEFGHIJKLMNOP
STRING 2 : QWERABCDZXVBERTY
这些字符串的相等部分是:ABCD
答案 0 :(得分:1)
请查看此计划是否可以为您提供帮助。它从命令行获取两个字符串作为参数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int *substring(char *s, char *t) {
int strlen1 = strlen(s);
int strlen2 = strlen(t);
int len = strlen1 < strlen2 ? strlen1 : strlen2;
int i, j, k;
int longest = 0;
int **ptr = (int **) malloc(2 * sizeof(int *));
static int *ret;
ret = (int *) calloc(strlen1 + 1, sizeof(int));
for (i = 0; i < 2; i++)
ptr[i] = (int *) calloc(strlen2, sizeof(int));
k = 0;
for (i = 0; i < strlen1; i++) {
memcpy(ptr[0], ptr[1], strlen2 * sizeof(int));
for (j = 0; j < strlen2; j++) {
if (s[i] == t[j]) {
if (i == 0 || j == 0) {
ptr[1][j] = 1;
} else {
ptr[1][j] = ptr[0][j - 1] + 1;
}
if (ptr[1][j] > longest) {
longest = ptr[1][j];
k = 0;
ret[k++] = longest;
}
if (ptr[1][j] == longest) {
ret[k++] = i;
ret[k] = -1;
}
} else {
ptr[1][j] = 0;
}
}
}
for (i = 0; i < 2; i++)
free(ptr[i]);
free(ptr);
ret[0] = longest;
return ret;
}
int main(int argc, char *argv[]) {
int i, longest, *ret;
if (argc != 3) {
printf("usage: longest-common-substring string1 string2\n");
exit(1);
}
ret = substring(argv[1], argv[2]);
if ((longest = ret[0]) == 0) {
printf("There is no common substring\n");
exit(2);
}
i = 0;
while (ret[++i] != -1) {
printf("%.*s\n", longest, &argv[1][ret[i] - longest + 1]);
}
exit(0);
}
测试
./a.out ABCDEFGHIJKLMNOP QWERABCDZXVBERTY
ABCD
答案 1 :(得分:0)
比较两个字符串是一项很容易找到信息的常用技巧。首先,您应该阅读function getSelected() {
return $scope.searchresponse.filter(function (x) {
return x.selected;
});
}
// alternative implementation
var getSelected = [].filter.bind(
$scope.searchresponse,
function (x) { return x.selected; });
库,在那里您可以找到许多有用的函数来处理字符串。
然后第一个愚蠢的算法是将第一个字符串的每个字符与第二个字符串进行比较,如果匹配则将该字符串添加到结果中。
但订购两个字符串然后比较它们会更聪明,从而节省了许多比较。