努力,成長,提高

          在追求中進步
          數據加載中……
          用動態規劃算法對最大子串問題的java實現
          最大字串問題描述大概就是給定2個字符串,找出他們兩個共有的最長字符串。比如一個是"tabcfg"另外一個"abckj"那么最大子串就是"abc".
          動態規劃算法最重要的就是分解問題,找出遞歸。說一下我的思考思路,首先拿到2個字符串,如何找到最長子串呢?
          1.假設他們(字符串a,b)的頭字母不相同的話,那么分別去掉首字母比較,也就是說用a.subString(1)和b比較,用b.subString(1)和a比較,最長子字符串沒變吧?答案是肯定的。ok遞歸出現了,結束條件就是有一個字符串變空,返回值就是a和b的最長子串。
          b.假設他們頭字母相同,那么一直比較下去,知道兩者的第n個字母不相同,然后把前n-1個字母存為子字符串c,把a.subString(1)和b返回結果記為d,b.subString(1)和a返回結果記為e,那么返回c,d和e最長的一個(感謝lexy的評論,之前確實遺漏一種情況。不應該直接把前面的相同的去掉直接比較的,現在代碼已經更新了)。
          也許有人說應該從后面往前面比較,找到相同的然后一個個再往前比,其實道理都是一樣的,關鍵要找到分解問題的方法。這里只是拋磚引玉,下面是具體的java實現。
          import java.util.HashMap;
          import java.util.Map;
           
          /**
          @author HEACK
          *
          */
          public class CompareStr {
           
                  
          /**
                  * 
          @param args
                  
          */
                  
          public static void main(String[] args) {
                          
          // TODO Auto-generated method stub
                          String str1 = "abcde1234567abcdefghijk";
                          String str2 
          = "abcdefgh12345";
                         
                          
          //String str2 = "abc happyies dutcbirthday peter";
                          CompareStr cj = new CompareStr();
                          System.out.println(cj.getLongestString(str1,str2));
           
                  }
           
                  
          private boolean isEmpty(String str) {
                          
          return str == null || str.trim().length() == 0;
                  }
                  
          private Map map = new HashMap();
           
                  
          private String getLongestString(String str1, String str2) {
                          
          if (isEmpty(str1) || isEmpty(str2)) {
                                  
          return "";
                          }
                          StringBuffer key 
          = new StringBuffer();
                          key.append(str1).append(
          "&&").append(str2);
                          
          if (map.containsKey(key.toString())) {
                                  
          return (String)map.get(key.toString());
                          }
                          StringBuffer longestStr 
          = new StringBuffer();
                          
          char[] str1List = str1.toCharArray();
                          
          char[] str2List = str2.toCharArray();
                          
          int i = 0;
                          
          for (i = 0; i < str1List.length && i < str2List.length; i++) {
                                  
          if (str1List[i] == str2List[i]) {
                                          longestStr.append(str1List[i]);
                                  } 
          else {
                                          
          break;
                                  }
                          }
                          String subStr1 
          = str1.substring(i);
                          String subStr2 
          = str2.substring(i);
                          
          if (i == 0) {
                                  String retStr1 
          = getLongestString(subStr1.substring(1), subStr2);
                                  String retStr2 
          = getLongestString(subStr1, subStr2.substring(1));
                                  String returnStr 
          = retStr1.length() >= retStr2.length() ? retStr1 : retStr2;
                                  map.put(key.toString(), returnStr);
                                  
          return returnStr;
                          } 
          else {
                                  String retStr1 
          = getLongestString(str1.substring(1), str2);
                                  String retStr2 
          = getLongestString(str1, str2.substring(1));
                                  String retStr 
          = retStr1.length() > retStr2.length() ? retStr1
                              : retStr2;
                                  String returnStr 
          = retStr.length() >= longestStr.toString().length() ? retStr
                                                  : longestStr.toString();
                                  map.put(key.toString(), returnStr);
                                  
          return returnStr;
                          }
                  }
           
          }

          HashMap用來存儲已經計算過的字符串,用空間換時間。代碼當然還可以優化,您也可以一試身手哦。

          posted on 2009-09-15 01:19 孔陽 閱讀(4437) 評論(7)  編輯  收藏

          評論

          # re: 用動態規劃算法對最大子串問題的java實現 2009-09-15 14:35 mui

          不知道這是不是個bug:
          String str1 = "asdfxfghj";
          String str2 = "fghjxasdf";
          輸出asdf。
            回復  更多評論    

          # re: 用動態規劃算法對最大子串問題的java實現[未登錄] 2009-09-15 14:40 孔陽

          @mui
          是這個問題的
          現在這個程序可能不會找到所有的同樣等長的最長字符串
          你這個返回的應該是asdf fghj
          這個只需要稍微修改一下程序即可
          如果字符串和當前最長的等長的話那么就添加到一個全局的list當中
          實現方法多種多樣:D
            回復  更多評論    

          # re: 用動態規劃算法對最大子串問題的java實現 2009-09-15 17:43 找個美女做老婆

          Java樂園交流社區(四) 歡迎廣大Javaer加入,大家一起交流,共同進步:
          群號:81107233

          Java樂園學習網站:http://www.javaly.cn
          有大量的學習資料,視頻教程。
            回復  更多評論    

          # re: 用動態規劃算法對最大子串問題的java實現 2009-09-16 14:27 lexy

          算法有問題。
          String str1 = "abcde1234567abcdefghijk";
          String str2 = "abcdefgh12345";
          返回:12345
          應該返回:abcdefgh 吧?
            回復  更多評論    

          # re: 用動態規劃算法對最大子串問題的java實現 2009-09-16 17:04 孔陽

          @lexy
          感謝lexy的提醒,現在代碼已經更新,原因在原文里面有說明:D
            回復  更多評論    

          # re: 用動態規劃算法對最大子串問題的java實現 2009-11-04 21:11 ddr

          在不考慮性能的情況下 ,看看我這段代碼能不能完成這個需求
          public String findMaxSubString(String str,String tarStr){
          String temp = "";
          if(str.length()>tarStr.length()){
          temp = str;
          str = tarStr;
          tarStr = temp;
          }
          temp = str;
          int strLength = str.length();
          for( ;strLength>0;strLength--){
          String temp_ =null;
          while(true){
          temp_ = str.substring(0,strLength);
          str = str.substring(1);
          if(tarStr.indexOf(temp_)>0)
          return temp_;
          if(str.length()<strLength){
          str = temp;
          break;
          }
          }
          }
          return null;
          }
            回復  更多評論    

          # re: 用動態規劃算法對最大子串問題的java實現 2011-12-07 15:02 flounders

          @ddr
          你的方式能很好的實現功能,不過性能太差了。。
            回復  更多評論    

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 平果县| 平顺县| 巨野县| 扶沟县| 河池市| 花莲县| 湖口县| 邛崃市| 香河县| 任丘市| 江山市| 奉化市| 迁安市| 怀集县| 浦城县| 台中市| 张家界市| 石泉县| 上蔡县| 文水县| 东丽区| 德州市| 山西省| 乳山市| 仁怀市| 启东市| 星子县| 壤塘县| 麻栗坡县| 卓资县| 洮南市| 五大连池市| 江都市| 绥芬河市| 马鞍山市| 丹江口市| 浠水县| 新乡市| 东丽区| 荃湾区| 谷城县|