题目

最长公共前缀

给k个字符串,求出他们的最长公共前缀(LCP)

样例

在 "ABCD" "ABEF" 和 "ACEF" 中,  LCP 为 "A"

在 "ABCDEFG", "ABCEFG", "ABCEFA" 中, LCP 为 "ABC"

解题

思路:

1.找到最短的字符串,求出长度shortest

2.设最短公共前缀是shortest

3.遍历所有字符串,比较长度是shortest的前缀是否相同,相同就是答案

3.不相同shortest-=1 重复 2 、3 步

Java

public class Solution {
/**
* @param strs: A list of strings
* @return: The longest common prefix
*/
public String longestCommonPrefix(String[] strs) {
// write your code here
HashMap<Character,Integer> map= new HashMap<Character,Integer>();
if(strs.length ==0)
return "";
int len = strs.length;
int shortest = Integer.MAX_VALUE;
for(int i=0;i<len;i++){
int tmplen = strs[i].length();
shortest = Math.min(shortest,tmplen);
}
int i =0;
while(shortest>0){
for( i=0;i<len-1;i++){
String str1 = strs[i].substring(0,shortest);
String str2 = strs[i+1].substring(0,shortest);
if( str1.equals(str2))
continue;
else
break;
}
if(i==len-1)
break;
else
shortest--;
}
return strs[0].substring(0,shortest); }
}

Java Code

既然可以倒着走,也可以正着走

public class Solution {
/**
* @param strs: A list of strings
* @return: The longest common prefix
*/
public String longestCommonPrefix(String[] strs) {
// write your code here
if(strs.length ==0)
return "";
if(strs.length == 1)
return strs[0];
int len = strs.length;
int shortest = 1;
boolean flag = false;
int i =0;
while(!flag){
for( i=0;i<len-1;i++){
if(strs[i].length() < shortest|| strs[i+1].length() < shortest){
flag = true;
break;
}
String str1 = strs[i].substring(0,shortest);
String str2 = strs[i+1].substring(0,shortest);
if( str1.equals(str2))
continue;
else
break;
}
if(i==len-1)
shortest++;
else{
flag= true;
} }
return strs[0].substring(0,shortest-1); }
}

Java Code

正着走就没有比较字符串,直接比较对应字符是否相等就好了

public class Solution {
/**
* @param strs: A list of strings
* @return: The longest common prefix
*/
public String longestCommonPrefix(String[] strs) {
// write your code here
if(strs.length ==0)
return "";
if(strs.length == 1)
return strs[0];
int len = strs.length;
int shortest = 0;
boolean flag = false;
int i =0;
while(!flag){
for( i=0;i<len-1;i++){
if(strs[i].length() <= shortest|| strs[i+1].length() <= shortest){
flag = true;
break;
}
char ch1 = strs[i].charAt(shortest);
char ch2 = strs[i+1].charAt(shortest);
if( ch1== ch2)
continue;
else
break;
}
if(i==len-1)
shortest++;
else{
flag= true;
} }
return strs[0].substring(0,shortest); }
}

Java Code

可能会发现三个返回结果为什么不一样?

1.逆着找,取子串的方式是  substring(start,end)  取得是从start 到 end -1 位置内的字符,这里的shortest就相当于end 在最后比较结束的时候 shortest 是当前比较结束的位置,这个end位置内的前缀都一样

所以返回的是substring(0,shortest) 取得字符是:0 到shortest -1的部分

2.正着找,跳出循环的是 第一个不满足条件的shortest ,取子串的方式也是  substring(start,end) 需要进行shortest - 1

3.比较字符,跳出循环的shortest是最长子串的后一个位置,可以直接用substring(0,shortest) 返回结果的

lintcode :最长公共前缀的更多相关文章

  1. lintcode-78-最长公共前缀

    78-最长公共前缀 给k个字符串,求出他们的最长公共前缀(LCP) 样例 在 "ABCD" "ABEF" 和 "ACEF" 中, LCP 为 ...

  2. [转][LeetCode]Longest Common Prefix ——求字符串的最长公共前缀

    题记: 这道题不难但是很有意思,有两种解题思路,可以说一种是横向扫描,一种是纵向扫描. 横向扫描:遍历所有字符串,每次跟当前得出的最长公共前缀串进行对比,不断修正,最后得出最长公共前缀串. 纵向扫描: ...

  3. LeetCode Longest Common Prefix 最长公共前缀

    题意:给多个字符串,返回这些字符串的最长公共前缀. 思路:直接逐个统计同一个位置上的字符有多少种,如果只有1种,那么就是该位是相同的,进入下一位比较.否则终止比较,返回前缀.可能有一个字符串会比较短, ...

  4. 扩展KMP--求字符串S的所有后缀和字符串T的最长公共前缀

    在解上面这个问题前我们要先解决一个类似的问题:求字符串s的所有后缀和s本身的最长公共前缀: 我们用next[]数组保存这些值: 现在我们假设要求next[ x ],并且next[ i ] 0<i ...

  5. BNUOJ34990--Justice String (exkmp求最长公共前缀)

    Justice String Given two strings A and B, your task is to find a substring of A called justice strin ...

  6. [Swift]LeetCode14. 最长公共前缀 | Longest Common Prefix

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

  7. [LeeCode]14. 最长公共前缀

    题目链接:https://leetcode-cn.com/problems/longest-common-prefix/ 题目描述: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀 ...

  8. python(leetcode)-14最长公共前缀

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  9. leetcode-14最长公共前缀

    leetcode-14最长公共前缀 题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower& ...

随机推荐

  1. linux内核打印"BUG: scheduling while atomic

    linux内核打印"BUG: scheduling while atomic"和"bad: scheduling from the idle thread"错误 ...

  2. 一、JPEG文件格式-----压缩框架

    JPEG文件格式 http://wenku.baidu.com/view/4856d31dc281e53a5802ff0d.html 标记名 FF E0                         ...

  3. Android Paint的使用以及方法介绍(附源码下载)

    要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下: se ...

  4. 容器适配器之queue

    转载http://blog.csdn.net/thefutureisour/article/details/7751846容器适配器容器适配器其实就是一个接口转换装置,使得我们能用特定的方法去操作一些 ...

  5. background-clip

    background-clip 用来将背景图片做适当的裁剪以适应实际需要. 语法: background-clip : border-box | padding-box | content-box | ...

  6. Extjs中TextField中显示图标

    现看实现效果:   实现代码: { width:500, height : 25, fieldLabel : '过滤条件', itemId : 'queryText', labelAlign : 'r ...

  7. Matlab验证公式取值范围

    一.问题来源 t = 2xy/(x+y);融合相似度和信任度,我需要验证值域是不是[0,1]: 二.求解 clear all; clc; %linspace(0:1,0.1)这样是错的,第三个参数是段 ...

  8. android的布局管理器

    理论上通过setContentView(view)能够把一个view设置到activity中,但当你有很多个view控件的时候,就需要用android的布局管理器来管理view控件了. android ...

  9. Hibernate O/R Mapping模拟

    作为SSH中的重要一环,有必要理解一下Hibernate对 O/R Mapping的实现. 主要利用java的反射机制来得到完整的SQL语句. 准备工作: 1. Object Student实体类: ...

  10. Javascript 性能优化的一点技巧

    把优秀的编程方式当成一种习惯,融入到日常的编程当中.下图是今天想到的一点Javascript 性能优化的技巧,分享一下,抛砖引玉.