返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++怎么实现最长共同前缀
  • 516
分享到

C++怎么实现最长共同前缀

2023-06-19 13:06:23 516人浏览 安东尼
摘要

本篇内容介绍了“c++怎么实现最长共同前缀”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Longest Common Prefix 最长共同

本篇内容介绍了“c++怎么实现最长共同前缀”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Longest Common Prefix 最长共同前缀

Write a function to find the longest common prefix string amongst an array of strings.

If there is no common prefix, return an empty string "".

Example 1:

Input: ["flower","flow","flight"]
Output: "fl"

Example 2:

Input: ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.

Note:

All given inputs are in lowercase letters a-z.

这道题让我们求一系列字符串的共同前缀,没有什么特别的技巧,无脑查找即可,定义两个变量i和j,其中i是遍历搜索字符串中的字符,j是遍历字符串集中的每个字符串。这里将单词上下排好,则相当于一个各行长度有可能不相等的二维数组,遍历顺序和一般的横向逐行遍历不同,而是采用纵向逐列遍历,在遍历的过程中,如果某一行没有了,说明其为最短的单词,因为共同前缀的长度不能长于最短单词,所以此时返回已经找出的共同前缀。每次取出第一个字符串的某一个位置的单词,然后遍历其他所有字符串的对应位置看是否相等,如果有不满足的直接返回 res,如果都相同,则将当前字符存入结果,继续检查下一个位置的字符,参见代码如下:

C++ 解法一:

class Solution {public:    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 = 1; i < strs.size(); ++i) {                if (j >= strs[i].size() || strs[i][j] != c) {                    return res;                }            }            res.push_back(c);        }        return res;    }};

Java 解法一:

public class Solution {    public String longestCommonPrefix(String[] strs) {        if (strs == null || strs.length == 0) return "";        String res = new String();        for (int j = 0; j < strs[0].length(); ++j) {            char c = strs[0].charAt(j);            for (int i = 1; i < strs.length; ++i) {                if (j >= strs[i].length() || strs[i].charAt(j) != c) {                    return res;                }            }            res += Character.toString(c);        }        return res;    }}

我们可以对上面的方法进行适当精简,如果发现当前某个字符和第一个字符串对应位置的字符不相等,说明不会再有更长的共同前缀了,直接通过用 substr 的方法直接取出共同前缀的子字符串。如果遍历结束前没有返回结果的话,说明第一个单词就是公共前缀,返回为结果即可。代码如下:

C++ 解法二:

class Solution {public:    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(); ++i) {                if (j >= strs[i].size() || strs[i][j] != strs[0][j]) {                    return strs[i].substr(0, j);                }            }        }        return strs[0];    }};

Java 解法二:

class Solution {    public String longestCommonPrefix(String[] strs) {        if (strs == null || strs.length == 0) return "";        for (int j = 0; j < strs[0].length(); ++j) {            for (int i = 0; i < strs.length; ++i) {                if (j >= strs[i].length() || strs[i].charAt(j) != strs[0].charAt(j)) {                    return strs[i].substring(0, j);                 }               }        }        return strs[0];    }}

我们再来看一种解法,这种方法给输入字符串数组排了个序,想想这样做有什么好处?既然是按字母顺序排序的话,那么有共同字母多的两个字符串会被排到一起,而跟大家相同的字母越少的字符串会被挤到首尾两端,那么如果有共同前缀的话,一定会出现在首尾两端的字符串中,所以只需要找首尾字母串的共同前缀即可。比如例子1排序后为 ["flight", "flow", "flower"],例子2排序后为 ["cat", "dog", "racecar"],虽然例子2没有共同前缀,但也可以认为共同前缀是空串,且出现在首尾两端的字符串中。由于是按字母顺序排的,而不是按长度,所以首尾字母的长度关系不知道,为了防止溢出错误,只遍历而这种较短的那个的长度,找出共同前缀返回即可,参见代码如下:

C++ 解法三:

class Solution {public:    string longestCommonPrefix(vector<string>& strs) {        if (strs.empty()) return "";        sort(strs.begin(), strs.end());        int i = 0, len = min(strs[0].size(), strs.back().size());        while (i < len && strs[0][i] == strs.back()[i]) ++i;        return strs[0].substr(0, i);    }};

Java 解法三:

class Solution {    public String longestCommonPrefix(String[] strs) {        if (strs == null || strs.length == 0) return "";        Arrays.sort(strs);        int i = 0, len = Math.min(strs[0].length(), strs[strs.length - 1].length());        while (i < len && strs[0].charAt(i) == strs[strs.length - 1].charAt(i)) i++;        return strs[0].substring(0, i);    }}

“C++怎么实现最长共同前缀”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C++怎么实现最长共同前缀

本文链接: https://lsjlt.com/news/296209.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++怎么实现最长共同前缀
    本篇内容介绍了“C++怎么实现最长共同前缀”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Longest Common Prefix 最长共同...
    99+
    2023-06-19
  • C++实现LeetCode(14.最长共同前缀)
    [LeetCode] 14. Longest Common Prefix 最长共同前缀 Write a function to find the longest common pre...
    99+
    2024-04-02
  • C++动态规划怎么实现查找最长公共子序列
    本篇内容介绍了“C++动态规划怎么实现查找最长公共子序列”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!最长公共子序列最长公共子序列(LCS)...
    99+
    2023-07-02
  • C++动态规划实现查找最长公共子序列
    目录最长公共子序列代码实现结果最长公共子序列 最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。一个数列 ,如果分别是两个或多个已知...
    99+
    2024-04-02
  • C++实现LeetCode(208.实现字典树(前缀树))
    [LeetCode] 208. Implement Trie (Prefix Tree) 实现字典树(前缀树) Implement a trie with insert,&...
    99+
    2024-04-02
  • redis集群实现清理前缀相同的key
    目录redis集群清理前缀相同的key原来的定期清理脚本的逻辑redis集群(jedis)批量删除同一前缀redis集群清理前缀相同的key 最近经常收到redis集群告警,每天收到...
    99+
    2024-04-02
  • C++中怎么利用LeetCode实现最多有两个不同字符的最长子串
    本篇文章给大家分享的是有关C++中怎么利用LeetCode实现最多有两个不同字符的最长子串,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。[LeetCode] 159. Long...
    99+
    2023-06-20
  • C++实现LeetCode(159.最多有两个不同字符的最长子串)
    [LeetCode] 159. Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串 Given...
    99+
    2024-04-02
  • C++实现LeetCode(5.最长回文子串)
    [LeetCode] 5. Longest Palindromic Substring 最长回文子串 Given a string s, find the longest ...
    99+
    2024-04-02
  • C++实现LeetCode(32.最长有效括号)
    [LeetCode] 32. Longest Valid Parentheses 最长有效括号 Given a string containing just the characte...
    99+
    2024-04-02
  • Linux怎么实现共享内存同步
    本篇内容主要讲解“Linux怎么实现共享内存同步”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux怎么实现共享内存同步”吧!方法一、利用POSIX有名信号灯实现共享内存的同步有名信号量既可...
    99+
    2023-06-28
  • C#算法怎么实现无重复字符的最长子串
    这篇文章主要介绍“C#算法怎么实现无重复字符的最长子串”,在日常操作中,相信很多人在C#算法怎么实现无重复字符的最长子串问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#算法怎么实现无重复字符的最长子串”的疑...
    99+
    2023-06-26
  • C++实现LeetCode(128.求最长连续序列)
    [LeetCode] 128.Longest Consecutive Sequence 求最长连续序列 Given an unsorted array of integers, fi...
    99+
    2024-04-02
  • C++实现最长有效括号的方法
    这篇文章主要讲解了“C++实现最长有效括号的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++实现最长有效括号的方法”吧!Longest Valid Parentheses 最长有效括...
    99+
    2023-06-20
  • 怎么利用Hadoop实现求共同好友
    这篇文章主要介绍怎么利用Hadoop实现求共同好友,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言在很多社交APP中,比如大家熟悉的QQ好友列表中,打开会话框,经常可以看到下面有一栏共同好友的推荐列表,用户通过这种...
    99+
    2023-06-26
  • C++中怎么实现共享内存
    C++中怎么实现共享内存,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。初次使用C++标准库实现共享内存的管理时,Vector每次分配内存个数不固定,回收也不固定,这样的话,程序...
    99+
    2023-06-17
  • C++实现无重复字符的最长子串
    目录题目及要求:提示:原创代码:代码思路:题目及要求: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 提示: 0 <= s.length <...
    99+
    2024-04-02
  • 怎么用Python容错的前缀树实现中文纠错
    这篇文章主要介绍“怎么用Python容错的前缀树实现中文纠错”,在日常操作中,相信很多人在怎么用Python容错的前缀树实现中文纠错问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Python容错的前缀树...
    99+
    2023-06-20
  • C#中怎么实现长异步操作
    本篇文章为大家展示了C#中怎么实现长异步操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。程序中执行按钮的Click 处理如下:private void _btnRun_Clic...
    99+
    2023-06-18
  • c语言变长数组怎么实现
    在C语言中,变长数组(Variable Length Arrays,VLA)可以通过使用动态分配的方式来创建。具体步骤如下: 声...
    99+
    2024-03-13
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作