黑马程序员—取两个字符串中最大相同子串

------- android培训、java培训、期待与您交流! ----------

 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变量的值 但不会创建很多对象

转载于:https://www.cnblogs.com/wan-to-fly/archive/2013/01/30/2883366.html

猜你喜欢

转载自blog.csdn.net/weixin_34413802/article/details/93653012