原题目:
Write a function to find the longest common prefix string amongst an array of strings.
找到一个字符串数组中,最长的公共前缀子串,并输出。
算法分析:
算法1:各种错误,各种提交不通过,各种特殊情况没考虑,服了!
算法2:
纵向扫描,从位置0开始,对每一个位置比较所有字符串,直到遇到一个不匹配。
时间复杂度为O(n1+n2+n3+...)
算法3:
横向扫描,每个字符串与第0个字符串,从左到右比较,直到遇到一个不匹配,然后下一个字符串。
时间复杂度O(n1+n2+n3+...)
错误代码:
错误1:没有考虑空字符串的情况。
解决办法:可以通过str.isEmpty判断一个字符串是否为空。不能用null,或“”,因为null代表一个对象的值。
错误2:
都为空的情况,没有考虑。
错误3:
字符串数组越界。
LeetCode提交源码:
算法1:错误代码!
public String longestCommonPrefix(String[] strs){
if(strs == null || strs.length <=0){
return "";
}
if(strs.length == 1)
return strs[0];
int shortlen = 1;
String result = "";
for(int i = 1; i < strs.length; i++){
shortlen=Math.min(shortlen,strs[i-1].length());
if(strs[i].isEmpty()){
return result;
}
}
System.out.println("shortlen=" + shortlen);
/*for(int i = 0; i < strs.length; i++){
if(strs[i].isEmpty()){
//System.out.println("flag");
strs[i] = strs[i+1];
}
System.out.println("strs=" + strs[i]);
}
*/
for(int j = shortlen-1; j >= 0; j--){
System.out.println("j = " + j);
for(int i = 0; i < strs.length - 1; i++){
System.out.println("i=" + i);
if(strs[i].charAt(j) != strs[i+1].charAt(j)){
result = "";
break;
}
if(i ==strs.length - 2){
result = strs[i].charAt(j) + result;
}
}
}
return result;
}
算法2:
/*算法2:纵向扫描,从位置0开始,对每一个位置比较所有字符串,直到遇到一个不匹配
时间复杂度为O(n1+n2+n3+...)*/
class SolutionMethod2{
public String longestCommonPrefix(String[] strs){
if(strs.length == 0)
return "";
/*直接用字符数组中的第一个字符串作为判断比较依据*/
for(int j = 0; j < strs[0].length();++j){
for(int i = 1; i < strs.length;++i){
if(j == strs[i].length() || //用于判断某个字符串是否为空
strs[i].charAt(j) != strs[0].charAt(j))
return strs[0].substring(0,j); //通过substring来截取相同前缀的字符串
}
}
return strs[0];
}
}
算法3:
/*
算法3:横向扫描,每个字符串与第0个字符串,从左到右比较,直到遇到一个不匹配,然后下一个字符串
时间复杂度O(n1+n2+n3+...)*/
class SolutionMethod3{
public String longestCommonPrefix(String[] strs){
if(strs.length == 0)
return "";
int right_most = strs[0].length();
for(int i = 1; i < strs.length; ++i){
for(int j = 0; j < right_most; j++){
if(j == strs[i].length() ||
strs[i].charAt(j) != strs[0].charAt(j))
right_most = j;
}
}
return strs[0].substring(0,right_most);
}
}
完整运行程序:
/**************************************************************
* Copyright (c) 2016
* All rights reserved.
* 版 本 号:v1.0
* 题目描述: Write a function to find the longest common prefix string amongst an array of strings.
*
* 输入描述:请输入一个字符串数组,用空格隔开:
* abc abcdeagad abcdfadgasd abcdfadg abcfdfdaf
* 程序输出:算法1输出:
* a
* 算法2输出:
* abc
* 算法1输出:
* abc
* 问题分析:无
* 算法描述:算法2:纵向扫描,从位置0开始,对每一个位置比较所有字符串,直到遇到一个不匹配
* 时间复杂度为O(n1+n2+n3+...)
* 横向扫描,每个字符串与第0个字符串,从左到右比较,直到遇到一个不匹配,然后下一个字符串
* 时间复杂度O(n1+n2+n3+...)
* 完成时间:2016-11-28
***************************************************************/
package org.GuoGuoFighting.LeetCode014;
import java.util.Scanner;
//算法1:非正确答案,针对某些特殊情况无法返回正确值
class SolutionMethod1{
public String longestCommonPrefix(String[] strs){
if(strs == null || strs.length <=0){
return "";
}
if(strs.length == 1)
return strs[0];
int shortlen = 1;
String result = "";
for(int i = 1; i < strs.length; i++){
shortlen=Math.min(shortlen,strs[i-1].length());
if(strs[i].isEmpty()){
return result;
}
}
for(int j = shortlen-1; j >= 0; j--){
for(int i = 0; i < strs.length - 1; i++){
if(strs[i].charAt(j) != strs[i+1].charAt(j)){
result = "";
break;
}
if(i ==strs.length - 2){
result = strs[i].charAt(j) + result;
}
}
}
return result;
}
}
/*算法2:纵向扫描,从位置0开始,对每一个位置比较所有字符串,直到遇到一个不匹配
时间复杂度为O(n1+n2+n3+...)*/
class SolutionMethod2{
public String longestCommonPrefix(String[] strs){
if(strs.length == 0)
return "";
/*直接用字符数组中的第一个字符串作为判断比较依据*/
for(int j = 0; j < strs[0].length();++j){
for(int i = 1; i < strs.length;++i){
if(j == strs[i].length() || //用于判断某个字符串是否为空
strs[i].charAt(j) != strs[0].charAt(j))
return strs[0].substring(0,j); //通过substring来截取相同前缀的字符串
}
}
return strs[0];
}
}
/*
算法3:横向扫描,每个字符串与第0个字符串,从左到右比较,直到遇到一个不匹配,然后下一个字符串
时间复杂度O(n1+n2+n3+...)*/
class SolutionMethod3{
public String longestCommonPrefix(String[] strs){
if(strs.length == 0)
return "";
int right_most = strs[0].length();
for(int i = 1; i < strs.length; ++i){
for(int j = 0; j < right_most; j++){
if(j == strs[i].length() ||
strs[i].charAt(j) != strs[0].charAt(j))
right_most = j;
}
}
return strs[0].substring(0,right_most);
}
}
public class LongestCommonPrefix {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符串数组,用空格隔开:");
String str = scanner.nextLine();
String[] tmp = str.split(" ");
scanner.close();
for(int i = 0; i < tmp.length; i++){
System.out.print(tmp[i] + ",");
}
SolutionMethod1 solution1 = new SolutionMethod1();
System.out.println("算法1输出:");
System.out.println(solution1.longestCommonPrefix(tmp));
SolutionMethod2 solution2 = new SolutionMethod2();
System.out.println("算法2输出:");
System.out.println(solution2.longestCommonPrefix(tmp));
SolutionMethod3 solution3 = new SolutionMethod3();
System.out.println("算法1输出:");
System.out.println(solution3.longestCommonPrefix(tmp));
}
}
程序运行结果: