提问人:Nickolas Etyuhibosecyu 提问时间:11/5/2023 最后编辑:Nickolas Etyuhibosecyu 更新时间:11/5/2023 访问量:57
有 N 个字符串。在最少的操作数中,在每个操作之前找到最相似的索引(从开始)
There are N strings. Find the index of the most similar (from start) before each one in the smallest number of operations
问:
“字符串”是指抽象“符号”的数组,它们可以但不一定是文字文本字符串。“最相似”是指开始时最长的公共部分(此任务不涉及非常复杂的算法来查找字符串的所有公共部分,引导公共部分就足够了)。“Before each one”表示每个字符串仅与前面的字符串进行比较。“操作”是指基本操作,如果一些简短而漂亮的 LINQ 调用将每个字符串与每个字符串进行比较,它将执行 N * (N - 1) / 2 个操作,而不是一个操作。
例如,输入 { K, M, G, KG, MG, KMG, KGG, T, KT, MT, GT, KGT, MGT, MTT } 必须导致输出 { -1, -1, -1, 0, 1, 3, 5, -1, 6, 4, 2, 6, 4, 9 }
我试过这段代码:
//AnyType[][] strings;
var result = new int[strings.Length];
for (var i = 1; i < strings.Length; i++)
{
int matchIndex = -1, matchLength = 0;
for (var j = i - 1; j >= 0; j--)
{
var length = Math.Min(strings[i].Length, strings[j].Length);
var k = 0;
for (; k < length && strings[i][k].Equals(strings[j][k]); k++) ;
if (k <= matchLength)
continue;
matchLength = k;
matchIndex = j;
}
result[i] = matchIndex;
}
(这是抽象表示,可能有错别字。
但是,当然,这不是最优的,因为执行 N * (N - 1) / 2 * (3 * K + 6) 基本运算(K 是匹配长度),大约等于 1.5n3。如何以更优化的方式做同样的事情?
答: 暂无答案
评论