题解 | #牛族寻找祖先#

牛族寻找祖先

https://www.nowcoder.com/practice/eea77a55616f4961801796c7d36369db

知识点:

字符串操作:代码中使用了字符串操作,如获取字符串长度、截取子串、比较字符等。例如,names[i].size()用于获取第i个字符串的长度,names[i].substr(0,j)用于截取第i个字符串的前j个字符。

边界条件处理:在代码中,先检查了向量是否为空,避免了空向量的处理问题。在实际编程中,边界条件的检查是一个重要的程序设计方面,可以防止出现异常情况。

分析:

  1. 首先,函数接收一个参数names,它是一个存储字符串的向量(vector)。这些字符串是要进行比较的对象,我们要找出它们的最长公共前缀。
  2. 接下来,代码开始进行一些边界条件的检查。它首先检查向量names的大小是否为0,如果是,表示没有字符串可以比较,于是函数直接返回一个空字符串""作为结果。
  3. 如果向量names不为空,代码继续执行。它创建了一个名为ans的字符串,并将其初始化为names[0],即向量中的第一个字符串。我们将从这个字符串开始,逐步找到它和其他字符串的最长公共前缀。
  4. 然后,代码使用for循环遍历向量strs中的其他字符串。从索引1开始(即第二个字符串),因为我们已经将第一个字符串作为初始值保存在ans中。
  5. 在循环的每个迭代中,我们使用j来表示当前比较的字符索引。然后,使用while循环来比较ans[j]和names[i][j]的字符是否相等,同时确保j不超过ans和当前字符串names[i]的长度。
  6. 如果ans[j]和names[i][j]的字符相等,那么j增加1,继续比较下一个字符。
  7. 如果ans[j]和names[i][j]的字符不相等,说明我们找到了最长公共前缀的边界,此时退出while循环。
  8. 接着,代码使用substr函数截取字符串names[i],从索引0开始,截取长度为j的部分。这个部分就是当前字符串names[i]与前面所有字符串的最长公共前缀。
  9. 最后,代码将截取得到的最长公共前缀更新到ans中,作为新的ans。然后继续处理下一个字符串,直到所有字符串都比较完毕。
  10. 当循环结束后,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;
    }

全部评论

相关推荐

昨天 18:09
门头沟学院 Java
苍穹外卖和谷粒商城这俩是不是烂大街了,还能做吗?
想去重庆的鸽子在吐槽:你不如把这俩做完自己搞明白再优化点再来问 何必贩卖焦虑
点赞 评论 收藏
分享
06-07 19:59
门头沟学院 C++
补药卡我啊😭:都快15年前的了还在11新特性
你的简历改到第几版了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务