- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定两个字符串,S1 和 S2。给定的计分方案包括空位罚分、不匹配分数和匹配分数。
找到与 S2 最匹配的 S1。
我的想法是列出所有可能的S1,然后与S2一一匹配。使用暴力列出所有可能的 S1。然后使用 dp 将每个可能的 S1 与 S2 匹配。
有没有更快的方法呢?或建议任何引用?
最佳答案
使用维基百科和一点思考可以编写出如下代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifndef MAX
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif
#define MATCH_SCORE 2
#define MISMATCH_SCORE -1
#define GAP_SCORE 0
// Calculates the match score recursively.
long MatchScore(const char* p/* in: may contain 'x' */,
const char* s/* in: doesn't contain 'x' */)
{
long res;
if (*p && *s)
{
if ((*p == *s) ||
((*p == 'x') && (*s >= 'a') && (*s <= 'f')))
{
res = MatchScore(p + 1, s + 1) + MATCH_SCORE;
}
else
{
long s1 = MatchScore(p + 1, s + 1) + MISMATCH_SCORE;
long s2 = MatchScore(p, s + 1) + GAP_SCORE;
long s3 = MatchScore(p + 1, s) + GAP_SCORE;
res = MAX(s1, MAX(s2, s3));
}
}
else
{
res = GAP_SCORE * (long)(strlen(p) + strlen(s));
}
return res;
}
// Calculates the best matching string and the match score
// using dynamic programming, the score must be the same
// as returned by MatchScore().
void FindBestMatch(const char* p/* in: may contain 'x' */,
const char* s/* in: doesn't contain 'x' */,
long* score/* out: match score */,
char** match/* out: best matching string */)
{
size_t lp = strlen(p) + 1;
size_t ls = strlen(s) + 1;
size_t i, j;
long* table = (long*)malloc(lp * ls * sizeof(long));
for (i = 0; i < lp; i++)
table[0 * lp + i] = GAP_SCORE * i;
for (j = 0; j < ls; j++)
table[j * lp + 0] = GAP_SCORE * j;
for (j = 1; j < ls; j++)
{
for (i = 1; i < lp; i++)
{
if ((p[i-1] == s[j-1]) ||
((p[i-1] == 'x') && (s[j-1] >= 'a') && (s[j-1] <= 'f')))
{
table[j * lp + i] = table[(j-1) * lp + (i-1)] + MATCH_SCORE;
}
else
{
table[j * lp + i] =
MAX(table[(j-1) * lp + (i-1)] + MISMATCH_SCORE,
MAX(table[(j-1) * lp + i] + GAP_SCORE,
table[j * lp + (i-1)] + GAP_SCORE));
}
}
}
*score = table[lp * ls - 1];
// Now, trace back the score table and construct the best matching string
*match = (char*)malloc(lp);
(*match)[lp - 1] = '\0';
for (j = ls, i = lp; j || i;)
{
if ((p[i-1] == s[j-1]) ||
((p[i-1] == 'x') && (s[j-1] >= 'a') && (s[j-1] <= 'f')))
{
(*match)[i-1] = s[j-1];
j--;
i--;
}
else
{
if (table[(j-1) * lp + i] > table[j * lp + (i-1)])
{
j--;
}
else
{
(*match)[i-1] = p[i-1];
i--;
}
}
}
free(table);
}
int main(void)
{
const char* pattern = "acdxdcxecxf";
const char* str = "abdfdaaed";
long score;
char* match;
char* match2;
printf("pattern=\"%s\" str=\"%s\"\n", pattern, str);
FindBestMatch(pattern, str, &score, &match);
printf("score=%ld (recursive)\n", MatchScore(pattern, str));
printf("score=%ld best match=\"%s\"\n", score, match);
// Now repeat with the best match we've just found,
// the result must be the same
printf("\nRepeating with pattern=best match:\n\n");
printf("pattern=\"%s\" str=\"%s\"\n", match, str);
FindBestMatch(match, str, &score, &match2);
printf("score=%ld (recursive)\n", MatchScore(match, str));
printf("score=%ld best match=\"%s\"\n", score, match2);
free(match);
free(match2);
return 0;
}
输出:
pattern="acdxdcxecxf" str="abdfdaaed"
score=14 (recursive)
score=14 best match="acdfdcaecdf"
Repeating with pattern=best match:
pattern="acdfdcaecdf" str="abdfdaaed"
score=14 (recursive)
score=14 best match="acdfdcaecdf"
我想知道是否有任何错误(除了明显缺乏错误检查)。
关于algorithm - 使用 dp 耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684504/
Law of Demeter表示你应该只与你直接了解的对象交谈。也就是说,不要执行方法链接来与其他对象通信。当您这样做时,您正在与中间对象不恰本地建立不正确的链接coupling您的代码到其他代码。
我已经实现了一个 CodeService,它将从代码表中检索国家/地区列表。 在我的 ShippingService 中,我想检查订单是否运送到某个国家/地区。 在这种情况下,我应该使用 CodeSe
虽然这个论坛上有很多包含耦合和内聚示例的好示例,但我正在努力将其完全应用到我的代码中。我可以识别代码中可能需要更改的部分。是否有任何 Java 专家能够查看我的代码并向我解释哪些方面是好的和坏的。我根
我有一个创建新对象 Student 并将其添加到数组列表 studentRegister 的方法: public void addStudent(String name, String age) {
在高耦合环境中,更改一个模块会影响另一个模块。好的,但我看不出这怎么可能(除了更改方法签名或返回类型)? 好吧,如果我改变一个类,那么它只能在以下情况下破坏其他类中的代码: 如果我突然改变了一个方法的
问题描述: 我正在一个项目中,以采用现有的JavaScript脚本并对其进行修改以支持异步加载。如果您不了解异步或延迟加载脚本,但想了解更多信息read this。 main.js脚本要做的第一件事之
我正在编写一个模拟,需要一些关于设计的提示。基本思想是生成给定随机过程的数据,然后将其用于各种计算。例如对于 1 次迭代: 进程 1 -> 为源 1 生成数据:x1 进程 2 -> 为源 1 生成数据
给定两个字符串,S1 和 S2。给定的计分方案包括空位罚分、不匹配分数和匹配分数。 找到与 S2 最匹配的 S1。 我的想法是列出所有可能的S1,然后与S2一一匹配。使用暴力列出所有可能的 S1。然后
我尝试使用 ctypes.CDLL 类 (Linux) 在 Python 中加载 C 共享库 .so。这是 link告诉我我做了什么。正如我看到的文档,它说 CDLL 类假定函数返回 int 类型。我
目录 什么是耦合性 什么是程序间的耦合 如何解耦 工厂模式解耦 案例 原因就是: 解决思路:
我尝试使用 Matlab 函数 Pdepe ( https://www.mathworks.com/help/matlab/ref/pdepe.html ) 求解平流扩散 react 问题的一维耦合偏
如何处理高级 C++ 应用程序中的耦合? 我们可以使用(例如)Witty 编写的 web 应用程序的完成代码,并用它制作控制台应用程序吗? ...或者将其更改为使用 Qt 制作的带有 GUI 的桌面应
假设我们有类: class Post def save # implementation end def self.find(id) #implementation e
简介 我正在尝试使用接口(interface)、抽象类和泛型在 Java 中创建一个相当复杂的结构。由于没有使用泛型的经验,在创建良好的 OOP 设计方面只有一般经验,这开始证明是一个相当大的挑战。
考虑 Windows 资源管理器(或 regedit 或类似工具)。左侧是 TreeView ,右侧是 ListView 。在我所知道的所有情况下,右 View 的内容都反射(reflect)了左 P
我有一个耦合代码(fortran 和 c++),我现在在 python 中调用。 main.exe 工作正常,但是当我在 python 中调用耦合版本时,出现段错误(核心转储)错误。我确定了出现问题的
我正在尝试编写 CMakeLists.txt 以耦合一个简单的 FORTRAN 程序,该程序使用 iso_c_binding 调用 C++ 函数。当我使用 gfortran 作为 FORTRAN 编译
我们将 NHibernate 用于 ORM,在程序的初始化阶段,我们需要从数据库中加载某个类 T 的许多实例。 在我们的应用程序中,提取所有这些实例的以下代码需要很长时间: public IList
我是一名优秀的程序员,十分优秀!