📅  最后修改于: 2023-12-03 15:14:01.416000             🧑  作者: Mango
本文将介绍一种使用 C++ 语言编写的算法,实现在一组单词中寻找最长的公共前缀。该算法的时间复杂度为 $O(nk)$,其中 $n$ 为单词数量,$k$ 为单词中最长的字符长度。
我们可以先取第一个单词作为参照。然后依次遍历其他单词的每个字符,与参照单词相应位置进行比较。若全都匹配,则将该字符存入结果字符串中。若不匹配,则说明前缀已经不同,算法停止并返回结果字符串。
下面是代码的具体实现。我们用字符串类型 string
存放单词,使用字符串的 size()
方法获取字符串的长度。
/**
* @brief 通过单词匹配找到最长的公共前缀
* @param words 单词数组
* @return 最长的公共前缀
*/
string longestCommonPrefix(vector<string>& words) {
string prefix = words[0];
for (int i = 1; i < words.size(); i++) {
for (int j = 0; j < prefix.size(); j++) {
if (words[i][j] != prefix[j]) {
prefix.resize(j);
break;
}
}
}
return prefix;
}
函数 longestCommonPrefix
的参数 words
是一个字符串类型的数组,存放所有的单词。我们首先取第一个单词作为参照,然后遍历其他单词,比较每个单词与参照单词对应位置的字符是否相同。
如果相同,则将该字符存入结果字符串中;如果不同,则说明前缀已经不同,算法停止并返回结果字符串。
需要注意的是,为了便于处理,我们使用 prefix.resize(j)
方法将结果字符串的长度调整为当前匹配到的位置 $j$。这样可以使后续循环中的无效比较避免。
通过本文的介绍,我们了解了如何使用 C++ 语言编写一段用于寻找最长的公共前缀的算法。这个算法利用了循环与字符串类型的一些方法,效率较高且代码简洁易懂。如有任何问题,欢迎在评论区留言。