最长的共同前缀

本文介绍了一种寻找多个字符串最长公共前缀的有效算法。该算法通过保存每个字符串的开始迭代器并同步移动来实现,当发现不同字符或达到字符串结尾时返回当前公共前缀。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我用的方法是,同时保存每个 string 的begin 迭代器,让他们一起移动,然后统一比较,若是不同,或其中有的已经到了 end() ,那么就返回。否则所有的迭代器共同前进一步。

string longestCommonPrefix(vector<string>& strs) {
    if (strs.empty()){
        return string();
    }
    
    vector<string::iterator> its;
    for_each(strs.begin(), strs.end(), [&](string& s){its.push_back(s.begin());});
    const auto len = its.size();
    
    for (;;){
        const auto key = *its[0];
        for (size_t i = 0; i != len; ++i){
            if (its[i] == strs[i].end() || *its[i] != key){
                return string(strs[i].begin(), its[i]);
            }
        }
        for_each(its.begin(), its.end(), [](string::iterator& it){++it;});
    }
}

 

转载于:https://www.cnblogs.com/wuOverflow/p/4758268.html

英语单词的前缀构成有一定的规律,例如"incorrect"和 "inability"有相同前缀"in"。请完成如下的C++函数功能: findCommonPrefix(char *word1, char * word2, char *prefix) 该函数分析得到word1和word2两个单词的最长共同前缀, 分析结果存到参数prefix中(题目保证prefix所指向空间足够大)。 例如,"disadvantage"和"disagree"的最长共同前缀是"disa", "disadvantage"和"misunderstand"的最长共同前缀是空串。 提示:可能用到的字符串函数说明如下, strlen(char *str):返回字符串str的长度; strcpy(char *dest, char *src):把字符串src复制到dest; strcat(char *dest, char *src):把字符串src连接到dest后面; char *strstr(const char *s1, const char *s2):从s1中查找子串s2第一次出现的位置。 输入格式: 输入在一行中给出两个英文单词(单词内部不含空格等分隔字符),以空格进行分隔。 输出格式: 在一行中输出两个英文单词的最长共同前缀。 输入样例: disadvantage disagree 输出样例: disa 注意:仅在标有”Program”和”End”的注释行之间补充填写代码。 请勿改动主函数main和其它任何已有内容。 初始代码: #include <iostream> #include <fstream> #include <cstring> using namespace std; void findCommonPrefix(char *word1, char *word2, char *prefix) { /**********Program**********/ /********** End **********/ } int main() { char word1[100], word2[100]; char prefix[100]; cin >> word1 >> word2; findCommonPrefix(word1, word2, prefix); cout << prefix << endl; return 0; }
最新发布
06-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值