最长公共子序列暴力解法
最长公共子序列是利用动态规划来解决的,今天看书说到了暴力解法,觉得很简单就随手实现了下,确实很简单,但是却犯了个C语言中常见的小错误运算符的优先级问题,本来在判断j &i的值时不用加!=0这样的判断,我也是多此一举,反而引入了错误,&的优先级比起!=要低所以运行不正确,从这里也可以看出在C陷阱和缺陷中指出的问题虽然很浅显但是确实是经常犯的错误。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #define MAX 32 bool is_a_sub(const char* str, const char* s_str) { while (*str != '\0' && *s_str != '\0') { if (*str == *s_str) { ++s_str; } ++str; } return *s_str == '\0' ? true : false; } void public_sub_str(const char* str, const char* o_str) { int str_len = strlen(str); int pow_value = 1 << str_len; int i = 1; char sub_str[MAX] = ""; for (; i < pow_value; ++i) { int j = pow_value; int k = 0; int m = 0; char temp[MAX] = ""; for (; j > 0; j >>= 1) { if ((j & i) != 0) { temp[k++] = str[m]; } ++m; } temp[k] = '\0'; if (is_a_sub(o_str, temp)) { if (strlen(temp) > strlen(sub_str)) { strcpy(sub_str, temp); } } } fprintf(stderr, "%s\n", sub_str); } int main(void) { const char* str = "INTHEBEGINNING"; const char* o_str = "ALLTHINGSARELOST"; public_sub_str(str, o_str); return 0; }