作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
const char *_longest_common_substr(const char *s1, const char *s2, int n, int m) {
// assert n >= m
int max = 0; // keep track of max length found
int tmp = 0; // value is incremented till letters match
int begin = 0;
int try_begin = 0; // possible new begin index
int end = 0; // rv = s2[begin : end - 1]
for (int i = 0; i < n; i++) {
tmp = 0;
try_begin = 0;
// s1 is scanned circularly
for (int j = 0; j < m; j++) {
int index = (j + i) % n; // current s1 index
if (index < n && s1[index] == s2[j]) {
if (tmp == 0)
try_begin = j;
tmp++;
} else {
tmp = 0;
}
if (tmp > max) {
max = tmp;
begin = try_begin;
end = j + 1;
}
}
}
int size = begin >= end ? 0 : end - begin;
char *rv = malloc((size + 1) * sizeof(*rv));
int i;
for (i = 0; i < size; i++)
rv[i] = s2[begin + i];
rv[i] = '\0';
return rv;
}
const char *longest_common_substr(const char *s1, const char *s2, int n, int m) {
if (n < m)
return _longest_common_substr(s2, s1, m, n);
return _longest_common_substr(s1, s2, n, m);
}
此代码是否正确找到最长的公共(public)子字符串?我不明白为什么在很多地方,例如
wikipedia ,他们使用矩阵来解决问题,而在这个看似简单的解决方案中不需要它,时间复杂度仍然是
O(n*m) 而空间复杂度为
O(1) .
int main() {
const char *str1 = "identification";
const char *str2 = "administration";
printf("%s\n", longest_common_substr(str1, str2, strlen(str1), strlen(str2)));
}
输出是
ation
子字符串以循环方式使用,因此输入
action
tionac
输出将是
tionac
无论如何,我可以在字符串的末尾添加两个不同的无效字符来删除这个属性
最佳答案
你的算法很奇怪。您只计算最长字符串上的循环子字符串。如果字符串长度相等,则仅在第一个上计算圆形子字符串。
例如:
"bxa"
和 "ab"
你找到解决方案"ab"
因为您在 bxa
上计算循环子字符串"bxa"
和 "zaby"
您不考虑 "bxa"
中的循环子字符串你找不到"ab"
作为解决方案("abx", "bya")
和 ("bya", "abx")
即使只有参数的位置发生变化,也有不同的解决方案。 (如果两个参数长度相等,则仅在第一个参数上计算循环子字符串)。关于c - 查找最长公共(public)子串问题的最小空间复杂度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66268505/
我正在尝试创建一个程序,其中字符串的前三个字符重复给定次数,如下所示: foo('Chocolate', 3) # => 'ChoChoCho' foo('Abc', 3) # => 'AbcAbcA
我有以下字符串: std::string str = "Mode:AAA:val:101:id:A1"; 我想分离一个位于 "val:" 和 ":id" 之间的子字符串,这是我的方法: std::st
DNA 字符串可以是任意长度,包含 5 个字母(A、T、G、C、N)的任意组合。 压缩包含 5 个字母(A、T、G、C、N)的 DNA 字母串的有效方法是什么?不是考虑每个字母表 3 位,我们可以使用
是否有一种使用 levenstein 距离将一个特定字符串与第二个较长字符串中的任何区域进行匹配的好方法? 例子: str1='aaaaa' str2='bbbbbbaabaabbbb' if str
使用 OAuth 并使用以下函数使用我们称为“foo”(实际上是 OAuth token )的字符串加密 key public function encrypt( $text ) { // a
我是一名优秀的程序员,十分优秀!