最长公共子序列暴力解法

最长公共子序列是利用动态规划来解决的,今天看书说到了暴力解法,觉得很简单就随手实现了下,确实很简单,但是却犯了个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;
}

 

posted @ 2014-06-14 16:12  coder_zhang1  阅读(1793)  评论(0编辑  收藏  举报