标题:java 最长公共前缀[分治及递归、二分法,普通方法]
一、题目
二、题解
方法一:
/**方法一
* str与strs[i]比较n此
* @param strs
* @return
*/
public String longestCommonPrefix(String[] strs) {
if(null==strs || 0==strs.length) {//短路或,若前面为null,则后面都不需要判断了
return "";
}
if(1==strs.length) {
return strs[0];
}
String str=strs[0];
for(int t=1;t<strs.length;t++) {
int i=0;
int len=Math.min(str.length(), strs[t].length());
//得到最长前缀
while(i<len) {
if(str.charAt(i)==strs[t].charAt(i)) {
i++;
}else {
break;
}
}
if(i==0) {
return "";
}
str=str.substring(0, i);
}
return str.length()>=1? str:"";
}
方法二:
/**方法二
* 使用分治的思想
* @param strs
* @return
*/
public String longestCommonPrefix02(String[] strs) {
if(null==strs || 0==strs.length) {//短路或,若前面为null,则后面都不需要判断了
return "";
}
return this.logestCommonProfix02(strs,0,strs.length-1);
}
//一个递归
public String logestCommonProfix02(String[] strs,int start,int end) {
if(start==end) {
return strs[start];
}else {
int mid=(start+end)/2;
String s1=this.logestCommonProfix02(strs, start, mid);
String s2=this.logestCommonProfix02(strs, mid+1, end);
return this.longestCommon(s1,s2);
}
}
//求最长公共前缀
public String longestCommon(String s1,String s2) {
int len=Math.min(s1.length(), s2.length());
int i=0;
for(;i<len;i++) {
if(s1.charAt(i)!=s2.charAt(i)) {
break;
}
}
if(i==0) {
return "";
}
return s1.substring(0,i);
}
方法三:
/**方法三
* 测试使用二分法 找到长度最小的str,然后不断改变mid在str中的位置,达到找到公共的最长前缀
* @param strs
* @return
*/
public String longestCommonPrefix03(String[] strs) {
if(null==strs || 0==strs.length) {//短路或,若前面为null,则后面都不需要判断了
return "";
}
//先找到最小的长度的strs[i]
int min=Integer.MAX_VALUE;
int index=0;
for(int i=0;i<strs.length;i++) {
if(strs[i].length()<min) {
min=strs[i].length();
index=i;
}
}
//每取出一个,和所有的比较
int start=0;
int end=strs[index].length()-1;
int mid=0;
while(start<=end) {
mid=(start+end)/2;
if(this.longestCommonAll(strs,strs[index],mid)) {
start=mid+1;
}else {
end=mid-1;
}
}
if(this.longestCommonAll(strs, strs[index], mid)) {
return strs[index].substring(0,mid+1);
}else {
if(mid==0) {
return "";
}
return strs[index].substring(0, mid);
}
}
public boolean longestCommonAll(String[] strs,String str,int mid) {
if(str.length()==0){
return false;
}
for(int i=0;i<strs.length;i++) {
for(int j=0;j<=mid;j++) {
if(str.charAt(j)!=strs[i].charAt(j)) {
return false;
}
}
}
return true;
}
完整代码如下:
/**
* 最长公共前缀
* @author dell
*
*/
public class TestLongestCommonPrefix {
/**方法一
* str与strs[i]比较n此
* @param strs
* @return
*/
public String longestCommonPrefix(String[] strs) {
if(null==strs || 0==strs.length) {//短路或,若前面为null,则后面都不需要判断了
return "";
}
if(1==strs.length) {
return strs[0];
}
String str=strs[0];
for(int t=1;t<strs.length;t++) {
int i=0;
int len=Math.min(str.length(), strs[t].length());
//得到最长前缀
while(i<len) {
if(str.charAt(i)==strs[t].charAt(i)) {
i++;
}else {
break;
}
}
if(i==0) {
return "";
}
str=str.substring(0, i);
}
return str.length()>=1? str:"";
}
@Test
public void test() {
// String[] strs=new String[] {"flower","flow","flight"};
// String[] strs=new String[] {"fflower","flow","flight"};
// String[] strs=new String[] {"dog","racecar","car"};
String[] strs=new String[] {}; //不为null
// System.out.println("length:"+strs.length);
// System.out.println("null?:"+strs==null);
String str = this.longestCommonPrefix(strs);
System.out.println(str);
if(str=="") {
System.out.println("str:\"\" " );
}
}
/**方法二
* 使用分治的思想
* @param strs
* @return
*/
public String longestCommonPrefix02(String[] strs) {
if(null==strs || 0==strs.length) {//短路或,若前面为null,则后面都不需要判断了
return "";
}
return this.logestCommonProfix02(strs,0,strs.length-1);
}
//一个递归
public String logestCommonProfix02(String[] strs,int start,int end) {
if(start==end) {
return strs[start];
}else {
int mid=(start+end)/2;
String s1=this.logestCommonProfix02(strs, start, mid);
String s2=this.logestCommonProfix02(strs, mid+1, end);
return this.longestCommon(s1,s2);
}
}
//求最长公共前缀
public String longestCommon(String s1,String s2) {
int len=Math.min(s1.length(), s2.length());
int i=0;
for(;i<len;i++) {
if(s1.charAt(i)!=s2.charAt(i)) {
break;
}
}
if(i==0) {
return "";
}
return s1.substring(0,i);
}
@Test
public void test02() {
// String[] strs=new String[] {"flower","flow","flight"};
// String[] strs=new String[] {"fflower","flow","flight"};
// String[] strs=new String[] {"dog","racecar","car"};
// String[] strs=new String[] {"caa","","a","acb"};
String[] strs=new String[] {"caa","gfg","aa","aav"};
// String[] strs=new String[] {}; //不为null
// System.out.println("length:"+strs.length);
// System.out.println("null?:"+strs==null);
String str = this.longestCommonPrefix02(strs);
System.out.println("返回的结果为:"+str);
System.out.println("str.length():"+str.length());
System.out.println("str==\"\" :"+(str==""));
System.out.println("str==null:"+(str==null));
if(str=="") {
System.out.println("str:\"\" " );
}
}
/**方法三
* 测试使用二分法 找到长度最小的str,然后不断改变mid在str中的位置,达到找到公共的最长前缀
* @param strs
* @return
*/
public String longestCommonPrefix03(String[] strs) {
if(null==strs || 0==strs.length) {//短路或,若前面为null,则后面都不需要判断了
return "";
}
//先找到最小的长度的strs[i]
int min=Integer.MAX_VALUE;
int index=0;
for(int i=0;i<strs.length;i++) {
if(strs[i].length()<min) {
min=strs[i].length();
index=i;
}
}
//每取出一个,和所有的比较
int start=0;
int end=strs[index].length()-1;
int mid=0;
while(start<=end) {
mid=(start+end)/2;
if(this.longestCommonAll(strs,strs[index],mid)) {
start=mid+1;
}else {
end=mid-1;
}
}
if(this.longestCommonAll(strs, strs[index], mid)) {
return strs[index].substring(0,mid+1);
}else {
if(mid==0) {
return "";
}
return strs[index].substring(0, mid);
}
}
public boolean longestCommonAll(String[] strs,String str,int mid) {
if(str.length()==0){
return false;
}
for(int i=0;i<strs.length;i++) {
for(int j=0;j<=mid;j++) {
if(str.charAt(j)!=strs[i].charAt(j)) {
return false;
}
}
}
return true;
}
@Test
public void test03() {
// String[] strs=new String[] {"flower","flow","flight"};
// String[] strs=new String[] {"fflower","flow","flight"};
// String[] strs=new String[] {"dog","racecar","car"};
// String[] strs=new String[] {}; //不为null
String[] strs=new String[] {""};
// System.out.println("length:"+strs.length);
// System.out.println("null?:"+strs==null);
String str = this.longestCommonPrefix03(strs);
System.out.println(str);
if(str=="") {
System.out.println("str:\"\" " );
}
}
//杂用
@Test
public void test01() {
String s="abcd";
String str=s.substring(0,0);
System.out.println("result:"+str);
System.out.println("length:"+str.length());
if(str=="") {
System.out.println("hhhh " );
}
String sub="";
System.out.println("result:"+sub);
System.out.println("length:"+sub.length());
if(sub=="") {
System.out.println("aaaa");
}
String str1=null;
String str2=new String();//不为null,长度为0
System.out.println("str2.length():"+str2.length());
System.out.println("str2 null?:"+str2==null);
String[] nums=new String[] {};//length:0,不为null,不过此时还没有nums[0]
System.out.println("nums:length:"+nums.length);
System.out.println("nums:"+nums);
String s22="";
// System.out.println(s22.charAt(0));//记住,这里不行
}
}