[LintCode] Longest Common Prefix 最长共同前缀

本文介绍了如何找到多个字符串中的最长公共前缀,并提供了两种解法的C++实现代码。第一种解法通过逐字符比较来确定公共前缀;第二种解法则通过两两字符串对比的方式寻找最长公共前缀。

 

Given k strings, find the longest common prefix (LCP).

 
Example

For strings "ABCD", "ABEF" and "ACEF", the LCP is "A"

For strings "ABCDEFG", "ABCEFG" and "ABCEFA", the LCP is "ABC"

 

LeetCode上的原题,请参见我之前的博客Longest Common Prefix

 

解法一:

class Solution {
public:    
    /**
     * @param strs: A list of strings
     * @return: The longest common prefix
     */
    string longestCommonPrefix(vector<string> &strs) {
        if (strs.empty()) return "";
        string res = "";
        for (int j = 0; j < strs[0].size(); ++j) {
            char c = strs[0][j];
            for (int i = 0; i < strs.size(); ++i) {
                if (j >= strs[i].size() || strs[i][j] != c) return res;
            }
            res.push_back(c);
        }
        return res;
    }
};

 

解法二:

class Solution {
public:    
    /**
     * @param strs: A list of strings
     * @return: The longest common prefix
     */
    string longestCommonPrefix(vector<string> &strs) {
        if (strs.empty()) return "";
        for (int j = 0; j < strs[0].size(); ++j) {
            for (int i = 0; i < strs.size() - 1; ++i) {
                if (j >= strs[i].size() || j >= strs[i + 1].size() || strs[i][j] != strs[i + 1][j]) {
                    return strs[i].substr(0, j);
                }
            }
        }
        return strs[0];
    }
};

 

转载于:https://www.cnblogs.com/grandyang/p/6132943.html

### 最长公共前缀算法的实现 最长公共前缀Longest Common Prefix, LCP)是一种经典的字符串处理算法,用于找到一组字符串中的共同起始部分。以下是基于不同方法的实现方式。 #### 方法一:纵向扫描法 纵向扫描法的核心思想是从左到右逐列比较每个字符串的字符,直到发现不一致的位置为止。这种方法简单直观,在大多数情况下表现良好[^3]。 ```python def longest_common_prefix(strs): if not strs: return "" prefix = strs[0] for i in range(1, len(strs)): while strs[i].find(prefix) != 0: prefix = prefix[:-1] if not prefix: return "" return prefix ``` #### 方法二:横向扫描法 横向扫描法通过依次比较每一对字符串来逐步缩小可能的公共前缀范围。此方法的时间复杂度主要取决于最短字符串长度和输入列表大小[^4]。 ```python def longest_common_prefix_horizontal(strs): if not strs: return "" prefix = strs[0] for s in strs[1:]: i = 0 while i < len(prefix) and i < len(s) and prefix[i] == s[i]: i += 1 prefix = prefix[:i] if not prefix: break return prefix ``` #### 方法三:分治法 分治法将整个字符串集合分割成较小的部分分别求解,最后合并结果得到最终答案。这种方式适合大规模数据集下的分布式计算环境。 ```python def lcp(s1, s2): min_length = min(len(s1), len(s2)) for i in range(min_length): if s1[i] != s2[i]: return s1[:i] return s1[:min_length] def longest_common_prefix_divide_conquer(strs, left=0, right=None): if right is None: right = len(strs) - 1 if left == right: return strs[left] mid = (left + right) // 2 lcp_left = longest_common_prefix_divide_conquer(strs, left, mid) lcp_right = longest_common_prefix_divide_conquer(strs, mid + 1, right) return lcp(lcp_left, lcp_right) ``` #### 方法四:Trie树法 利用字典树结构存储所有字符串,则可以通过遍历根节点至叶子路径上的共享分支快速定位最大共用头部片段。 ```python class TrieNode: def __init__(self): self.children = {} def insert(root, word): node = root for char in word: if char not in node.children: node.children[char] = TrieNode() node = node.children[char] def find_lcp(root): result = [] current_node = root while current_node and len(current_node.children) == 1 and '*' not in current_node.children: next_char = list(current_node.children.keys())[0] result.append(next_char) current_node = current_node.children[next_char] return ''.join(result) def longest_common_prefix_trie(strs): if not strs: return "" root = TrieNode() for string in strs: insert(root, string) return find_lcp(root) ``` 上述四种方法各有特点,可根据具体需求选择合适的方案实施开发工作[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值