【问题标题】:C# or JavaScript: Determining common prefix in strings [duplicate]C# 或 JavaScript:确定字符串中的公共前缀 [重复]
【发布时间】:2011-12-01 04:27:55
【问题描述】:

可能重复:
Find common prefix of strings

假设我有一个字符串数组。该数组至少有两个元素,并且可能更多。数组中的每个字符串至少有两个字符,可能更多,并且至少每个字符串的第一个字符是相同的。

给定所述字符串数组,确定所有字符串共享的最长前缀的最有效方法是什么?

例如,给定['cowgirl', 'cowboy'],公共前缀是cow。或者,给定['a', 'abs', apples'],公共前缀是a

【问题讨论】:

    标签: arrays string algorithm functional-programming


    【解决方案1】:

    您可以查看这些资源以查找两个或多个字符串之间的最长公共前缀子字符串。即使算法以其他语言呈现,我相信您也可以将其中的一种适应 JavaScript。

    Find common prefix of strings

    Algorithm Implementation/Strings/Longest common substring

    【讨论】:

    • -1:您提到的链接是针对最长公共子字符串的,这是一个非常困难的问题。这留下了重复的链接,更适合作为评论。
    【解决方案2】:

    我认为最简单的算法,也许是最有效的算法,就是按顺序检查单词,将迄今为止最长的公共前缀与每个单词进行比较,以确定您可以保留多少。使用第一个字符串作为初始前缀。

    编辑:这是一些可以完成工作的 Javascript 代码:

    function findLongestPrefix(list) {
        var prefix = list[0];
        var prefixLen = prefix.length;
        for (var i = 1; i < list.length && prefixLen > 0; i++) {
            var word = list[i];
            // The next line assumes 1st char of word and prefix always match.
            // Initialize matchLen to -1 to test entire word.
            var matchLen = 0;
            var maxMatchLen = Math.min(word.length, prefixLen);
            while (++matchLen < maxMatchLen) {
                if (word.charAt(matchLen) != prefix.charAt(matchLen)) {
                    break;
                }
            }
            prefixLen = matchLen;
        }
        return prefix.substring(0, prefixLen);
    }
    

    【讨论】:

    • 赞成。您可以通过存储前缀长度来消除循环内的 substring() 调用。
    • 好点。我会修改代码。
    • 即使在修复了语法错误之后,此代码也不起作用
    • @LastCoder 我修正了拼写错误(对于 Java 污染感到抱歉)。这个对我有用。你能发一个反例吗?请注意,代码假定列表的所有元素至少具有共同的第一个字符,正如 OP 所指定的并且 cmets 明确说明。
    • 现在似乎工作正常。仅供参考:翻转投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2017-03-19
    • 2011-10-21
    • 2020-11-13
    • 2018-05-07
    相关资源
    最近更新 更多