【问题标题】:Longest Common Contiguous Substring Length in CC中最长的公共连续子串长度
【发布时间】:2014-07-20 02:39:39
【问题描述】:

以下是我为算法编写的代码。我找不到它有什么问题。测试用例应该分别产生 12、4 和 3,而是分别产生 8、1 和 2。我是不是对算法结构有误解?

#include <stdio.h>

#define MAX_STRING_LENGTH 100

void clear_memo(int memo[][MAX_STRING_LENGTH]);


// Returns the larger of a and b
int max(int a, int b){
  return a ? a > b : b;
}

int lcs_length(char A[], char B[], int i, int j, int memo[][MAX_STRING_LENGTH]){
  if(i == 0 && j == 0){
    clear_memo(memo);
  }

  if (memo[i][j] > 0){
    return memo[i][j];
  }

  if (A[i] == '\0' || B[j] == '\0'){
    memo[i][j] = 0;
  } 
  else if(A[i] == B[j]){
    memo[i][j] = 1 + lcs_length(A, B, i+1, j+1, memo);
  } 
  else{
    memo[i][j] = max(lcs_length(A, B, i+1, j, memo), lcs_length(A, B, i, j+1, memo));
  }

  return memo[i][j];
}

// Makes all the entries zero in the memo array
void clear_memo(int memo[][MAX_STRING_LENGTH]){
   for(int i = 0; i < MAX_STRING_LENGTH; i++){
    for(int j = 0; j < MAX_STRING_LENGTH; j++){
      memo[i][j] = 0;
    }
  }
}

// Tests the lcs_length() function
int main(){
  int memo[MAX_STRING_LENGTH][MAX_STRING_LENGTH];

  char a[] = "yo dawg how you doing?";
  char b[] = "yo dawg zhzzzozw?";
  printf("%d\n", lcs_length(a,b,0,0,memo));

  char c[] = "nano";
  char d[] = "nematode knowledge";
  printf("%d\n", lcs_length(c,d,0,0,memo));

  char e[] = "abcd";
  char f[] = "abdc";
  printf("%d\n", lcs_length(e,f,0,0,memo));

  return 0;
}

【问题讨论】:

  • @user3121023:为什么不提供这个作为可以接受的答案并且问题显示为已回答。

标签: c substring contiguous


【解决方案1】:

你的最大值是错误的。一种? a>b:b; 表示如果 a 不为零,则返回 a>b(如果 a>b 返回 1,否则返回 0),如果 a 为零,则返回 b。因此,即使 a 更大,也永远不会返回 a,并且仅当 a 为 0 时才返回 b,而不管哪个更大。 使用

int max(int a, int b){

    return a>b?a:b;
}

【讨论】:

    猜你喜欢
    • 2014-04-14
    • 2012-12-11
    • 2016-06-03
    • 2010-11-28
    • 2017-05-22
    • 2011-02-12
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多