leetcodeT14-最长公共前缀(两种解法+图解)
文章目录
- 题目:最长公共前缀
- 法一:暴力解法
- 思路
- 图解
- 代码
- 法二:两两对比法
- 思路
- 图解
- 代码
题目:最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:
strs = ["flower","flow","flight"]
输出:
"fl"
示例 2:
输入:
strs = ["dog","racecar","car"]
输出:
""
这道题重点词是 “前缀”,即我们要寻找的公共子串部分是在每个单词index=0的位置开始累计的
法一:暴力解法
思路
result:记录最终的前缀字符串
flag:标志位,记录当前字符串是否符合我们的要求
temp:候选字符串
因为提取的是前缀字符串,所以我们就选择strs数组中第一个元素作为基准。
外层循环 遍历strs中第一个元素的每个字母,这里我们用temp来存储累计的字符串。
那么内层循环遍历的是strs中的各个元素(即题目中strs数组的整个单词),判断 :
如果候选字符串temp在各个元素的下标0位置都存在,那么这个候选字符串temp是成立的。且这个候选字符串的长度大于result字符串的长度,就将temp赋值给result。
如果strs有任何一个元素头部并不符合候选字符串temp,那么给标志位赋一个false跳出内层循环(不再遍历判断strs之后的元素)。这时,再判断一次flag,并跳出外层循环(此时已计算出最长的前缀和)
图解
例如,题目中第一组数据中:
i = 0 时, temp = 'f';
strs[1]和strs[2]头部前缀符合temp,flag=true,进入下一次循环
- 因为上一次循环flag 为true,此时temp应加上strs[0]的后一个字母,即
i = 1 时, temp = 'fl';
strs[1]和strs[2]头部前缀符合temp,flag=true,进入下一次循环
- 同理,
i = 2 时, temp = 'flo';
但此时,strs[2]中却不符合temp的前缀和了,所以直接跳出循环,不将这次temp赋值给最终结果。
代码
/*** @param {string[]} strs* @return {string}*/
var longestCommonPrefix = function(strs) {var result = '';var temp = '';var flag = true;for (var i = 0; i < strs[0].length; i++) {temp += strs[0][i];for (var j = 1; j < strs.length; j++) {if (strs[j].indexOf(temp) !== 0) {flag = false;break;}}if (flag && (temp.length > result.length)) {result = temp;} else {break;}}return result.length > 0? result:"";
};
后面一想,这里其实根本不用判断result和temp的长度,既然前缀和一定是从0开始计算,那么候选字符串temp的长度后一个总是比前一个更长的。
所以可以把 (temp.length > result.length) 长度判断去掉
法二:两两对比法
思路
首先选取strs第一个元素作为ans(比较字符串),然后将strs剩下的所有元素和ans都两两比较一遍,在每次比较中都截取头部相同的字符串部分。
图解
将strs[0]作为and,比较字符串,剩下两个分别为strs[1],strs[2]
第一次将ans与strs[1]比较,发现相同的是"flo",故此时ans变为"flo"(红框圈起部分)
第二次将ans与strs[2]比较,相同字符串为"fl"此时ans变为"fl"
经过两次比较之后,最终的最长公共前缀就出来, 就是"fl"
代码
/*** @param {string[]} strs* @return {string}* 解法:两两比较*/
var longestCommonPrefix = function(strs) {var ans = strs[0];for (var i = 1; i < strs.length; i++) {for (var j = 0; j < strs[i].length && j < ans.length; j++) {if (strs[i][j] !== ans[j]) {break;}}ans = ans.substring(0, j);if (ans.length == 0) {return "";}}return ans;
};
leetcodeT14-最长公共前缀(两种解法+图解)相关推荐
- java两个字符串前缀_java – 找到两个字符串的最长公共前缀
我想找到两个字符串的最长公共前缀. 有没有办法循环我的最后几个if语句,以便我可以结束彼此不匹配的最后几个字符? System.out.println("Enter the first st ...
- LeetCode4_编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ““。(解决方案:横向扫描、 纵向扫描 、分治 二分查找 、秀儿操作之排序比较头尾)
题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow&q ...
- LeetCode 第 59 场力扣夜喵双周赛(最短路径数+迪杰斯特拉、动态规划+最长公共前缀问题) / 第255场周赛(二进制转换,分组背包,子集还原数组(脑筋急转弯))
第 59 场力扣夜喵双周赛 两道400多五百,后两道都写出代码来了,但是都有问题,哭辽- 还有刚开始第一道测试好慢,搞心态了 5834. 使用特殊打字机键入单词的最少时间 有一个特殊打字机,它由一个 ...
- CSU1632Repeated Substrings(后缀数组/最长公共前缀)
题意就是求一个字符串的重复出现(出现次数>=2)的不同子串的个数. 标准解法是后缀数组.最长公共前缀的应用,对于样例aabaab,先将所有后缀排序: aab 3 aabaab 1 a ...
- LeetCode 13罗马数字转整数14最长公共前缀
罗马数字转整数 上一题是整数转罗马数字,这题是罗马数字转整数.虽然是简单题,但我感觉其实有点烦. 上一次是数字转字符,这次是字符转数字,总的来说大体思想还是差不多的. 首先整个字符串可能是这样构造的: ...
- 最长公共前缀(java实现)
题目: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow& ...
- 2019-03-5-算法-进化(最长公共前缀)
题目描述 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow ...
- LeetCode刷题记录_最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...
- 14.最长公共前缀-LeetCode
1.问题描述 这里直接采用的是leetcode上面的问题描述 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 下面给出示例: 2.解题思路 ...
最新文章
- Java 8 简明教程
- 【Python-ML】SKlearn库多元线性回归性能评估
- linux中find命令的35个实际例子
- 如何结合SharePoint Designer 2010 与Visio 2010 创建工作流?
- 前端学习(2973):配置嵌套路由
- 前端学习(2960):实现发送axios请求
- MySQL表的操作(二)
- SpringCloud常见面试题(2020最新版)
- 疫情下的国内云市场,正是大展拳脚的好时机!
- 景驰无人车披露最新技术进展,2年后开启国内规模化运营 | 视频
- 稳的一比,鸿蒙系统霸榜Github!
- 邬建国教授受聘为浙江大学光彪教授
- android 15 activity跳转
- python cmath模块_python-cmath模块
- 俄罗斯方块菜单c语言,飞机游戏、俄罗斯方块、贪吃蛇C语言代码
- 嵌入式系统框架----软件篇
- aligned_alloc
- AT32F437VM SPI驱动AT7456E OSD芯片
- 研究生放假因疫情未按时返回,扣助研补贴!实验室奇葩规定引热议
- IMU内参标定以及初始化(9轴IMU,比6轴多三个姿态角信息)