例子:1."abcdf","abcte","abert"
则最长公共前缀为"ab",返回"ab"
2."ty","yuff","nfg"
没有最长公共前缀,返回" ";
方法一:以二维数组实现,依次对比每个字符,取出公共前缀
public class Commonality { public static void main(String[] args) { String[] s=new String[]{"aca","cba"}; Solution so=new Solution(); String s1=so.longestCommonPrefix(s); System.out.println(s1) } } class Solution{ public String longestCommonPrefix(String[] strs ){ String s=""; int start=0; char temp; if(strs.length==0)//如果字符串数组的长度为0;返回""; return ""; char[][]a=new char[strs.length][]; for(int i=0;i<a.length;i++){ //根据每个字符串的长度创建一个空的二维数组 a[i]=new char[strs[i].length()]; } start=a[0].length;//取第一个字符串长度 for(int i=0;i<a.length;i++){ char[]b=new char[strs[i].length()];//为每个字符串新建一个字符一维数组,以便赋值 b=strs[i].toCharArray(); if(start>strs[i].length()) start=strs[i].length(); for(int j=0;j<a[i].length;j++){ a[i][j]=b[j];//将每一个字符存入到二维数组中 } } a: for(int i=0;i<start;i++){/以a标记一个二重循环 char b=a[0][i];//分别取出第一行的每一个字符 int falg=1; for(int j=1; j<a.length;j++){ if(b!=a[j][i]) {//与对应的列的每个字符相比较 falg = 0; if(falg==0&&i==0) break a;//如果第一个字符就不相同则直接退出二重循环 } } if(falg==1) s+=b; } return s; } }
此方法思路较清晰,但过程较多,建立的数组空间较多。
方法二:以截取字符串的方法:
public class Commonality2 { public static void main(String[] args) { String[] s=new String[]{"flower","flow","flight"}; Solution1 so=new Solution1(); String r=so.longestCommonPrefix(s); System.out.println(r); } } class Solution1 { public String longestCommonPrefix(String[] strs) { if (strs.length == 0) return ""; String prefix = strs[0];//取出第一个字符串 for (int i = 1; i < strs.length; i++)//遍历后面的字符串 while (strs[i].indexOf(prefix) != 0) {//查找与第一个字符相同的字符,如果为0,则全部相同 prefix = prefix.substring(0, prefix.length() - 1);//每次截取的长度减一,再判断 if (prefix.isEmpty()) return ""; } return prefix; } }
此方法利用indox和substring的原理,想法较好,代码量较少。