Leetcode习题记录——Longest Common Prefix

来源:互联网 发布:加密软件破译系统 编辑:程序博客网 时间:2024/06/03 19:41

首先先普及一个知识:stringbuilder
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 。而stringbuilder会比stringBuffer更快

public class Solution {        public String longestCommonPrefix(String[] strs) {          String result = strs.length==0?"":strs[0];          for(int j=0;j<strs.length;j++){              result = commonPrefix(result,strs[j]);          }          return result;      }      private String commonPrefix(String origin,String target){          StringBuffer sb = new StringBuffer();          int loop = origin.length()>=target.length()?target.length():origin.length();          for(int i=0;i<loop;i++){              if(origin.charAt(i) == target.charAt(i)){                  sb.append(origin.charAt(i));              }else{                  break;              }          }          return sb.toString();      }  }

这个方法很巧妙,写了两个函数,重复使用result这个变量,避免了很多麻烦。

第二种方法:
这种方法先将数组排序,只比较最小的和最大的就能得出结果,更加巧妙。

public class Solution {    public String longestCommonPrefix(String[] strs) {        StringBuilder result = new StringBuilder();        if (strs!= null && strs.length > 0){            Arrays.sort(strs);            char [] a = strs[0].toCharArray();            char [] b = strs[strs.length-1].toCharArray();            for (int i = 0; i < a.length; i ++){                if (b.length > i && b[i] == a[i]){                    result.append(b[i]);                }                else {                    return result.toString();                    }                }            }         return result.toString();    }}
原创粉丝点击