黑马程序员—取两个字符串中最大相同子串
1 /* 2 查找两个字符串中的最长相同字串 3 */ 4 5 class Compare{ 6 //查找角标靠后的最长相同子串 7 public String lastCompare(String str,String str2) throws NullPointerException{ 8 return compare(ifAndToString(str,str2),"last"); 9 } 10 //查找角标靠前的最长相同子串 11 public String firstCompare(String str,String str2) throws NullPointerException{ 12 return compare(ifAndToString(str,str2),"first"); 13 } 14 //对长度教下的字符串进行处理,找出两个字符串中所有相同的字串 15 private String ifAndToString(String str,String str2) throws NullPointerException{ 16 String str3 = null; 17 String longchar = ""; 18 //如果传入非法数据 19 if(str == null && str2 == null && str == "" && str2 == "") 20 throw new NullPointerException("sorry 有非法数据传入!"); 21 //调换下长短字符串位置 方便下面进行操作 22 if(str.length() < str2.length()){ 23 String temp = str; 24 str = str2; 25 str2 = temp; 26 } 27 if(str.indexOf(str2) != -1){ 28 return str2; 29 }else{ 30 //对短的字符进行循环indexOf操作 31 for(int i = 0;i<str2.length(); i++){ 32 for(int j = str2.length() - 1; j>i; j--){ 33 if(str.indexOf(str3 = str2.substring(i,j)) != -1){ 34 //把相同的字串用逗号隔开存入一个字符串中,我也想过直接用数组,但不好定义长度 35 longchar += "," + str3; 36 } 37 } 38 } 39 } 40 return longchar; 41 } 42 //取出最长的字串 43 private String compare(String longchar,String order){ 44 if("".equals(longchar)) 45 return longchar; 46 String[] arr = longchar.split(","); 47 int index = 0; 48 //判断取靠前字串还是靠后的 49 if("first".equals(order)){ 50 for(int i = 1; i<arr.length; i++){ 51 if(arr[index].length() < arr[i].length()) 52 index = i; 53 } 54 }else{ 55 for(int i = arr.length - 1; i>0; i--){ 56 if(arr[index].length() < arr[i].length()) 57 index = i; 58 } 59 } 60 return arr[index]; 61 } 62 } 63 64 class XiangTongZiChuan{ 65 public static void main(String[] args){ 66 String str = "sdfasfdshelloewfwfeeeee"; 67 String str2 = "ssfdfhelloe"; 68 try{ 69 Compare cm = new Compare(); 70 System.out.println(cm.lastCompare(str,str2)); 71 }catch(NullPointerException e){ 72 e.printStackTrace(); 73 } 74 } 75 }
随笔心得:1.如果在方法中有要直接抛出异常return的特殊情况 可以选判断特殊情况 这样不用写else 优化了代码
2.在上面我判断数组中值长度最大的时候是先创建了一个String类型的变量在if中不断接收新值 这样在堆内存中也在不断创建String对象 后面我就改为了用一个int变量记录下标 这样虽然会不断改变int变量的值 但不会创建很多对象