题解 | #牛族寻找祖先#
牛族寻找祖先
https://www.nowcoder.com/practice/eea77a55616f4961801796c7d36369db
知识点:
字符串操作:代码中使用了字符串操作,如获取字符串长度、截取子串、比较字符等。例如,names[i].size()用于获取第i个字符串的长度,names[i].substr(0,j)用于截取第i个字符串的前j个字符。
边界条件处理:在代码中,先检查了向量是否为空,避免了空向量的处理问题。在实际编程中,边界条件的检查是一个重要的程序设计方面,可以防止出现异常情况。
分析:
- 首先,函数接收一个参数names,它是一个存储字符串的向量(vector)。这些字符串是要进行比较的对象,我们要找出它们的最长公共前缀。
- 接下来,代码开始进行一些边界条件的检查。它首先检查向量names的大小是否为0,如果是,表示没有字符串可以比较,于是函数直接返回一个空字符串""作为结果。
- 如果向量names不为空,代码继续执行。它创建了一个名为ans的字符串,并将其初始化为names[0],即向量中的第一个字符串。我们将从这个字符串开始,逐步找到它和其他字符串的最长公共前缀。
- 然后,代码使用for循环遍历向量strs中的其他字符串。从索引1开始(即第二个字符串),因为我们已经将第一个字符串作为初始值保存在ans中。
- 在循环的每个迭代中,我们使用j来表示当前比较的字符索引。然后,使用while循环来比较ans[j]和names[i][j]的字符是否相等,同时确保j不超过ans和当前字符串names[i]的长度。
- 如果ans[j]和names[i][j]的字符相等,那么j增加1,继续比较下一个字符。
- 如果ans[j]和names[i][j]的字符不相等,说明我们找到了最长公共前缀的边界,此时退出while循环。
- 接着,代码使用substr函数截取字符串names[i],从索引0开始,截取长度为j的部分。这个部分就是当前字符串names[i]与前面所有字符串的最长公共前缀。
- 最后,代码将截取得到的最长公共前缀更新到ans中,作为新的ans。然后继续处理下一个字符串,直到所有字符串都比较完毕。
- 当循环结束后,ans中存储的就是所有字符串的最长公共前缀,函数返回它作为结果。
总结:该代码使用垂直扫描的方法,从第一个字符串开始,逐步比较每个字符串与第一个字符串的字符,直到找到最长公共前缀。这个方法可以在一定程度上减少比较次数,找到最长公共前缀的效率较高。
编程语言:
C++
完整代码:
string findAncestor(vector<string>& names) { if (names.size() == 0) return ""; string ans = names[0]; for (int i = 1; i < names.size(); i++) { int j = 0; while (j < min(ans.size(), names[i].size())) { if (ans[j] != names[i][j]) break; ++j; } ans = names[i].substr(0, j); } return ans; }