最长公共前缀

原题

  Write a function to find the longest common prefix string amongst an array of strings.java

题目大意

  写一个函数找出一个字串所数组中的最长的公共前缀。算法

解题思路

  第一步先找出长度最小的字符串,而后将这个字符串与其它的字符串相比找出最短的最公共前缀。数组

代码实现

public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null) {
            return null;
        }

        if (strs.length == 0) {
            return "";
        }

        int min = Integer.MAX_VALUE;  // 记录最短的字符串的长度

        // 找短字符串的长度
        for (String str : strs) {

            if (str == null) {
                return null;
            }

            if (min > str.length()) {
                min = str.length();
            }
        }

        int i; // 记录最长前缀的字符数
        boolean flag;
        for (i = 0; i < min; i++) {
            flag = true;
            for (int j = 1; j < strs.length; j++) {
                if (strs[0].charAt(i) != strs[j].charAt(i)) {
                    flag = false;
                    break;
                }
            }

            if (!flag) {
                break;
            }
        }

//        if (i == 0) {
//            return null;
//        }

        return strs[0].substring(0, i);

    }
}

 

有点相似冒泡算法,每次都要找最小的串的长度,而后进行截取,代码以下app

 

[java] view plain copy函数

在CODE上查看代码片派生到个人代码片

  1. public String longestCommonPrefix(String[] strs) {  
  2.          if(strs.length==0) return "";  
  3.          String s=strs[0];  
  4.           for (int i = 1; i < strs.length; i++) {  
  5.                if(s.length()==0||strs[i].length()==0) return "";  
  6.                int len=Math.min(s.length(), strs[i].length());                  
  7.     //上面错在多加了一个count,可是在实际的时候当"a""b的时候,count为0 截取的子串仍是“a”  
  8.                int j;  
  9.                for (  j = 0; j <len; j++) {  
  10.                     //这里不能是==  
  11.                     if (s.charAt(j)!=strs[i].charAt(j))  
  12.                          break;  
  13.                }  
  14.                s=s.substring(0, j);//0到j-1的位置  
  15.           }  
  16.           return s;  
  17.     }  

 

其实作起来会感受很简单,须要注意的是要考虑效率的问题,毕竟多是很长的字符串数组,因此能够考虑选取全部字符串中最短的那个来首先进行比较,由于最长公共子串确定不会大于其长度,这样避免了字符串之间长度差别很大形成的效率损失,而后每次比较以后最长公共子串的长度也永远不会大于最短的那个字符串,只会不变或减少,只要遍历字符串数组,挨个对比、更改最短公共字符串记录便可,code以下:spa

string s = "";
	if(strs.empty())
		return s;
	int len = strs.size();
		int sLen = 0;
		int i=0, j=0;
		for(i=0; i<len; i++)
		{
			if(sLen < strs[i].size())
			{
				s = strs[i];
				sLen = strs[i].size();
			}
		}
		for(i=0; i<len; i++)
		{
			for(j=0; j<sLen; j++)
			{
				if(s[j] != strs[i][j])
					break;
			}
			s = s.substr(0, j);
			sLen = s.size();
		}
		return s;
相关文章
相关标签/搜索